如果我有一个名为Foo的类,我有这个函数+ getIds
应该返回id。 + getIds
的正确签名是否如下所示:
+ (NSArray *)getIds {
NSMutableArray *ids = [[[NSMutableArray alloc] init] autorelease];
return ids;
}
我想知道的是,如果我应该在*ids
上使用自动释放?我没有别的办法吗?在return语句之后我不能[ids release]
吗?
答案 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
存在的原因之一。
关于方法是否应该返回自动释放而不是保留对象:只有以alloc
或new
开头或包含copy
的方法(如mutableCopy
中所述)应返回保留的对象。所有其他方法都应返回自动释放的对象。