Objective-C / 数组中的内存泄漏
Posted
技术标签:
【中文标题】Objective-C / 数组中的内存泄漏【英文标题】:Memory Leaks in Objective-C / Arrays 【发布时间】:2011-06-01 16:11:33 【问题描述】:我正在查看某人的代码,我知道一般规则是如果您有 alloc/init,则需要释放该内存。他使用了很多 NSMutableArrays,分配/初始化它们,但没有释放它们。如果我没有看到任何其他发布/自动释放消息被发送到该数组,我可以简单地将自动释放消息发送到创建的数组吗?我基本上也不想让他的代码崩溃并停止工作:P。
使用 NSMutableArrays,当您发送消息 addObject 并且该数组中的对象增加其保留帐户时,如果该数组被释放,但该对象从未从数组中发送释放或 removeObject,这也是内存泄漏吗?谢谢。
【问题讨论】:
【参考方案1】:您需要任一 -release
或 -autorelease
-retain
、+alloc
、-copy
、+allocWithZone:
或 -copyWithZone:
。 (而且,如果你保留了两次,你也需要释放两次。)
当 NSMutableArray
(或 NSArray
、NSSet
或 NSDictionary
和可变子类)对象被释放(保留计数达到零)时,它会释放它包含的任何内容。当您将对象添加到 NSMutableArray
时,数组会保留该对象(它确实不像某些人声称的那样复制它)。
我向您和您在问题中提到的某人强烈推荐Memory Management Programming Guide。
我希望这个答案对您和某人有所帮助。祝你好运。 :)
另外,在构建设置中启用 Clang 静态分析器。这将在编译时告诉您何时会发生泄漏(以及更多)。事实上,当我开始一个新项目时,这是我总是做的第一件事。分析仪从来没有骗过我。
【讨论】:
【参考方案2】:NSArray
和NSMutableArray
在销毁时释放它们的所有对象,因此如果使用retain
和release
(或autorelease
)正确管理数组,则其中的对象不会泄漏。但是如果有一些数组永远不会被释放,它们就会泄漏,连同其中的所有内容。
没有看到代码,很难提倡在任何地方都添加autorelease
s,但是对于仅在单个函数上下文中使用的数组(而不是分配给 ivars 或静态变量),答案是肯定的,他们应该是autoreleased
。或者更惯用的方法是使用+arrayWithCapacity
之类的方法创建它们,它返回一个已经添加到自动释放池中的对象。
【讨论】:
【参考方案3】:通常的做法是释放您初始化的所有对象。但是在您的情况下,释放数组也应该释放所有对象。
但这一切都取决于你如何使用你的对象 !!!
【讨论】:
以上是关于Objective-C / 数组中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章