iOS正确的方式(内存管理)为一个方法返回一个值

时间:2011-07-01 10:53:02

标签: iphone objective-c ios cocoa-touch memory-management

如果我有一个名为Foo的类,我有这个函数+ getIds应该返回id。 + getIds的正确签名是否如下所示:

+ (NSArray *)getIds {

    NSMutableArray *ids = [[[NSMutableArray alloc] init] autorelease];

    return ids;
}

我想知道的是,如果我应该在*ids上使用自动释放?我没有别的办法吗?在return语句之后我不能[ids release]吗?

3 个答案:

答案 0 :(得分:3)

您可以发送 autorelease 消息以及 alloc,init 消息。您也可以return [ids autorelease]; 注意:您不应同时执行这两项操作; - )

您无法返回[id release],因为release方法本身不会返回任何内容。

答案 1 :(得分:1)

对于返回的对象,通常正确的内存管理是让被调用的方法将其设置为自动释放的对象,当方法名称包含“copy”,“new”或“alloc”时,之外。在这些情况下(copy / new / alloc),保留返回的对象,并且调用者拥有它(即调用者负责确保它们被释放)。

您在问题中编写的代码将执行正确的操作 - 它将返回一个自动释放的对象。

当调用者返回NSArray时,他们可以尽可能多地使用该对象,如果他们在将来的调用中不需要该对象,那么他们不需要做任何额外的内存管理。在运行循环结束时,将释放NSArray,这是所需的行为。如果调用者确实需要对象活得更久,那么他们必须在其上调用retain(或者等效的东西,比如调用其他调用retain的东西),然后他们接受有责任稍后致电发布。

有用的东西:

此外,当ARC(iOS 5中的自动引用计数)成为常态时,这一切都会消失。

答案 2 :(得分:0)

已经自动释放了数组,因此第二次调用autorelease将是一个可能导致崩溃的错误。返回后你无法做release这一事实(你当时离开了这个函数)是autorelease存在的原因之一。

关于方法是否应该返回自动释放而不是保留对象:只有以allocnew开头或包含copy的方法(如mutableCopy中所述)应返回保留的对象。所有其他方法都应返回自动释放的对象。