我正在看某人的代码,我知道一般的规则是,如果你有alloc/init,你需要释放那个内存。他使用了大量的NSMutableArrays,分配/初始化它们,但没有释放它们。如果我没有看到任何其他释放/自动释放消息发送到创建的阵列,我是否可以简单地将自动释放消息发送到该阵列?我基本上也不想让他的代码崩溃和停止工作。
使用NSMutableArrays时,当您发送消息addObject并且该数组中的对象增加其保留帐户时,如果该数组被释放,但该对象从未从该数组中获得release或removeObject,这是否也是内存泄漏?谢谢。
发布于 2011-06-02 00:14:41
您需要 -release或-autorelease任何您-retain、+alloc、-copy、+allocWithZone:或-copyWithZone:的东西。(而且,如果您保留了一件东西两次,您也需要释放它两次。)
当NSMutableArray (或NSArray、NSSet或NSDictionary和可变子类)对象被取消分配(保留计数为零)时,它将释放它包含的所有内容。当您将对象添加到NSMutableArray时,数组将保留该对象(它不会像某些人声称的那样复制 it )。
我向你和你在问题中提到的人强烈推荐Memory Management Programming Guide。
我希望这个答案能帮助你和其他人。祝好运。:)
另外,在构建设置中启用Clang Static Analyser。这将在编译时告诉你什么时候会发生泄漏(还有更多)。事实上,当我开始一个新项目时,这是我总是做的第一件事。分析器从来没有骗过我。
发布于 2011-06-02 00:14:00
NSArray和NSMutableArray在它们被销毁时释放它们的所有对象,因此,如果使用retain和release (或autorelease)正确管理数组,则其中的对象不会泄漏。但如果有从未发布的数组,它们将会泄漏,其中的所有内容也会泄漏。
在没有看到代码的情况下,很难提倡只在所有地方添加autorelease,但是对于只在单个函数的上下文中使用的数组(并且没有分配给ivar或静态变量),答案是肯定的,它们应该是autoreleased。或者更通俗地说,使用像+arrayWithCapacity这样的方法创建它们,该方法返回一个已经添加到自动释放池中的对象。
发布于 2011-06-02 00:17:01
通常的做法是释放所有初始化的对象。但是在您的例子中,释放数组也应该释放所有对象。
但这完全取决于你如何使用你的对象!
https://stackoverflow.com/questions/6204302
复制相似问题