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(或 NSArrayNSSetNSDictionary 和可变子类)对象被释放(保留计数达到零)时,它会释放它包含的任何内容。当您将对象添加到 NSMutableArray 时,数组会保留该对象(它确实像某些人声称的那样复制它)。

我向您和您在问题中提到的某人强烈推荐Memory Management Programming Guide。

我希望这个答案对您和某人有所帮助。祝你好运。 :)


另外,在构建设置中启用 Clang 静态分析器。这将在编译时告诉您何时会发生泄漏(以及更多)。事实上,当我开始一个新项目时,这是我总是做的第一件事。分析仪从来没有骗过我。

【讨论】:

【参考方案2】:

NSArrayNSMutableArray 在销毁时释放它们的所有对象,因此如果使用retainrelease(或autorelease)正确管理数组,则其中的对象不会泄漏。但是如果有一些数组永远不会被释放,它们就会泄漏,连同其中的所有内容。

没有看到代码,很难提倡在任何地方都添加autoreleases,但是对于仅在单个函数上下文中使用的数组(而不是分配给 ivars 或静态变量),答案是肯定的,他们应该是autoreleased。或者更惯用的方法是使用+arrayWithCapacity 之类的方法创建它们,它返回一个已经添加到自动释放池中的对象。

【讨论】:

【参考方案3】:

通常的做法是释放您初始化的所有对象。但是在您的情况下,释放数组也应该释放所有对象。

但这一切都取决于你如何使用你的对象 !!!

【讨论】:

以上是关于Objective-C / 数组中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL VBO 会泄漏内存吗?

内存泄漏与垃圾回收机制

分析 ThreadLocal 内存泄漏问题

Objective-C:CGDataProviderCopyData 的内存泄漏

内存泄漏和内存溢出的区别

Objective-C:内存泄漏与自动释放的多重分配?