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

dug*_*gla 4 cocoa-touch objective-c nsmutablearray

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

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

Rya*_*aig 12

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

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

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

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

正确使用实例方法将是:

a = [[NSMutableArray alloc] init];
// do stuff
[a release];
Run Code Online (Sandbox Code Playgroud)

正确使用类方法将是:

a = [NSMutableArray array];
// do stuff, array is in the autorelease pool
Run Code Online (Sandbox Code Playgroud)

请注意,Apple建议您尽可能远离便捷方法以提高性能.这是有争议的建议,可能不会节省太多的处理器时间,并将alloc-init从发布中分离出来,您可能实际上并不关心保留.


Ale*_*ski 6

来自Cocoa Memory Managment Rules:

如果使用名称以"alloc"或"new"开头或包含"copy"(例如,alloc,newObject或mutableCopy)的方法创建对象,或者向其发送保留消息,则获取对象的所有权.您有责任使用release或autorelease放弃您拥有的对象的所有权.在收到对象的任何其他时间,您不得释放它.

因此有了这条线:

a = [NSMutableArray array];
Run Code Online (Sandbox Code Playgroud)

你没有获得数组的所有权,它将被传递给你自动释放.内存将由自动释放池自动处理,一旦不再使用,它​​将为您释放.但是,如果要将数组保留在当前事件之外,则必须保留它,否则它将为您释放.