可可触摸问题。应保留[NSMutableArray数组]吗?

时间:2009-06-13 15:51:48

标签: objective-c cocoa-touch nsmutablearray

以下是我正在编写的一些代码的要点。我担心我没有正确解决NSMutableArray上数组类方法的保留/释放问题。以下是否实际泄漏记忆?

for(a while) { 
    // do stuff
    NSMutableArray *a = nil;
    // do stuff
    if (!a) {
        a = [NSMutableArray array];
    }
} // for(a while)

4 个答案:

答案 0 :(得分:12)

您不会在此代码中泄漏内存,并且在运行循环结束时自动释放数组时,自己释放数组会导致崩溃。

大多数Cocoa类提供了几种创建新对象的方法,并且与此约定非常一致:

  1. [[NSSomeObject alloc] init]:您负责释放对象(实例方法)。

  2. [NSSomeObject someObject]:对象将为您自动释放,通常在运行循环结束时(类方法)。它大致相当于[[[NSSomeObject alloc] init] autorelease]

  3. 实例方法的正确用法是:

    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)

是的,如果你想要它坚持下去。

返回的对象是一个自动释放的对象,当其自动释放池被清除时将被释放。

所有以“array”开头的数组类方法都会返回这些类型的自动释放对象。

通过apple

阅读此doc

答案 3 :(得分:0)

这是有效的。当您有疑问时,可以帮助您手动管理事物。

有一个惯例:

  • init前缀(init,initWithString :)表示保留计数为1,其中
  • objectname前缀(string,stringWithString :)表示自动释放的对象

多年来,我一直习惯于在通话现场释放我所能做到的,而不是推动它自动释放。然后,一些自动释放问题变得非常难以追踪。当然,在这种情况下,自动释放对程序员来说是方便的(没有出错),但会对重用,清晰度和性能产生负面影响(更多的是在大型代码库/程序中)。