以下是我正在编写的一些代码的要点。我担心我没有正确解决NSMutableArray上数组类方法的保留/释放问题。以下是否实际泄漏记忆?
for(a while) {
// do stuff
NSMutableArray *a = nil;
// do stuff
if (!a) {
a = [NSMutableArray array];
}
} // for(a while)
答案 0 :(得分:12)
您不会在此代码中泄漏内存,并且在运行循环结束时自动释放数组时,自己释放数组会导致崩溃。
大多数Cocoa类提供了几种创建新对象的方法,并且与此约定非常一致:
[[NSSomeObject alloc] init]
:您负责释放对象(实例方法)。
[NSSomeObject someObject]
:对象将为您自动释放,通常在运行循环结束时(类方法)。它大致相当于[[[NSSomeObject alloc] init] autorelease]
。
实例方法的正确用法是:
a = [[NSMutableArray alloc] init];
// do stuff
[a release];
正确使用类方法:
a = [NSMutableArray array];
// do stuff, array is in the autorelease pool
请注意,Apple建议您尽可能远离便捷方法以提高性能。这是controversial advice,可能不会节省太多的处理器时间,并且将div-init从发布中分离出来,您可能实际上并不关心保留这些内容。
答案 1 :(得分:6)
来自Cocoa Memory Managment Rules:
如果使用名称以“alloc”或“new”开头或包含“copy”(例如,alloc,newObject或mutableCopy)的方法创建对象,或者如果发送它,则获取对象的所有权保留信息。您有责任使用release或autorelease放弃您拥有的对象的所有权。在收到对象的任何其他时间,您都不能释放它。
因此,使用以下行:
a = [NSMutableArray array];
你没有获得数组的所有权,它将被传递给你自动释放。内存将由自动释放池自动处理,一旦不再使用,它将为您释放。但是,如果要将数组保留在当前事件之外,则必须保留该数组,否则将为您释放。
答案 2 :(得分:2)
答案 3 :(得分:0)
这是有效的。当您有疑问时,可以帮助您手动管理事物。
有一个惯例:
多年来,我一直习惯于在通话现场释放我所能做到的,而不是推动它自动释放。然后,一些自动释放问题变得非常难以追踪。当然,在这种情况下,自动释放对程序员来说是方便的(没有出错),但会对重用,清晰度和性能产生负面影响(更多的是在大型代码库/程序中)。