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)deallocNSAutoReleasePool释放对象有什么区别?

    (void)dealloc函数什么时候被调用,NSAutoReleasePool什么时候释放内存,我知道是每个循环周期,如何从代码中检查?

    1234563对象在标头,那么你不再可以分配对象,因为两者都会保留对象,谁能告诉我为什么我仍然可以这样编码而不会导致任何内存泄漏?

【问题讨论】:

重新标记:“内存”和“管理”到“内存管理” 这确实是一个用这种格式无法很好回答的问题。您需要获得一本关于 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内存管理问题的主要内容,如果未能解决你的问题,请参考以下文章

关于 iPhone 中的内存管理

在循环 iphone 中创建多个标签的内存管理

在 Objective-C (iphone) 中,如何管理“@protocol”引用的内存?

iPhone应用程序中C代码的内存管理

iphone(object-c) 内存管理 有效的内存管理 后半部分

iPhone 应用程序中的 EXC_BAD_ACCESS - 内存管理问题