iphone内存管理问题
Posted
技术标签:
【中文标题】iphone内存管理问题【英文标题】:iphone memory management issue 【发布时间】:2009-03-13 09:16:45 【问题描述】:如何判断一个对象是否已从内存中释放?
我知道当我们使用 alloc|copy|retain 来创建对象时,必须手动释放该对象。如果使用实例类方法(NSString stringwithformat:
),对象会被NSAutoRealeasePool
自动释放,但是,有时在(void)dealloc
函数那里有一些对象用于释放。
谁能告诉我
[object release]
[object release]
(void)dealloc
和NSAutoReleasePool
释放对象有什么区别?
(void)dealloc
函数什么时候被调用,NSAutoReleasePool
什么时候释放内存,我知道是每个循环周期,如何从代码中检查?
【问题讨论】:
重新标记:“内存”和“管理”到“内存管理” 这确实是一个用这种格式无法很好回答的问题。您需要获得一本关于 Objective-C 编程的好书并学习它。 (或者干脆放弃内存管理并坚持使用 ARC。) 【参考方案1】:[object release]
立即释放您的对象。发送释放消息后,您不应该再次使用该对象 - 除非您绝对知道您仍然对该对象有保留。如果您的保留是最后一个保留,则可以在调用释放期间释放内存。
自动释放会在“稍后”释放一个对象,系统不保证“稍后”的含义,除非它会在当前消息的范围之后。
见上文,从代码的角度来看,没有真正的 qay 可以保证在自动释放之后调用 dealloc 时。您应该假设它是在您发送自动释放消息的方法返回之后的某个时间。
您只需要平衡保留和释放。如果您有一对多(在您描述的情况下很可能),那就是泄漏。相反,如果你有不平衡,当你访问释放的内存时,你会产生一个更具破坏性的错误。
保留属性的正确顺序是:
alloc init // retain == 1
set the property // retain == 2 due to setProperty calling retain.
release the object // retain == 1
保留计数为 1,没有内存泄漏。
【讨论】:
我会修改你的#1,在“你不应该再次使用该对象”之后加上一个句点。释放对象后,您永远不应再次使用它。您可能“知道”您有另一个保留,但是当您可以轻松地将发布调用移动到其他地方时,这会使您的代码混乱。 一般来说是这样,但我认为在许多情况下保持弱引用是可以接受的。如果没有这种能力,你(可以)最终得到两个相互保留的对象和一个泄漏。根据经验,您是对的。 ...或者如果您有两个保留并释放一个,但知道您还有另一个保留。以上是关于iphone内存管理问题的主要内容,如果未能解决你的问题,请参考以下文章
在 Objective-C (iphone) 中,如何管理“@protocol”引用的内存?