autorelease
我知道您在 iOS 上需要小心。我有一个方法返回alloc
调用者需要的对象,所以在这种情况下——据我所知——我需要autorelease
在它返回之前发送给被调用者中的对象。
这很好,但是一旦控制权返回到手机(即在我的按钮点击被处理之后),似乎自动释放池被释放了。我怀疑这是应该的,但我想知道这种情况下的最佳做法是什么。
我已经求助于从调用者发送一条retain
消息,以便该对象不被释放,然后在dealloc
.
这是最好的方法吗?
autorelease
我知道您在 iOS 上需要小心。我有一个方法返回alloc
调用者需要的对象,所以在这种情况下——据我所知——我需要autorelease
在它返回之前发送给被调用者中的对象。
这很好,但是一旦控制权返回到手机(即在我的按钮点击被处理之后),似乎自动释放池被释放了。我怀疑这是应该的,但我想知道这种情况下的最佳做法是什么。
我已经求助于从调用者发送一条retain
消息,以便该对象不被释放,然后在dealloc
.
这是最好的方法吗?
自动释放池通常在每次运行循环迭代后释放。大致来说,每个 Cocoa 和 Cocoa Touch 应用程序的结构如下:
Get the next message out of the queue
Create an autorelease pool
Dispatch the message (this is where your application does its work)
Drain the autorelease pool
您描述的是预期的行为。如果您想保留一个对象比这更长的时间,您需要明确地保留它。
使用autorelease
是一种说法,“对象,我不再想要你了,但我会把你交给可能想要你的人,所以现在不要消失。” 因此,该对象将停留足够长的时间,以便您从方法中返回它或将其提供给另一个对象。当一些代码想要保留对象时,它必须通过retain
ing 来声明所有权。
请参阅内存管理指南,了解正确使用所需的一切autorelease
。
这是Apple 内存管理文档中提供的示例:
– (id)findMatchingObject:(id)anObject
{
id match = nil;
while (match == nil) {
NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init];
/* Do a search that creates a lot of temporary objects. */
match = [self expensiveSearchForObject:anObject];
if (match != nil) {
[match retain]; /* Keep match around. */
}
[subPool release];
}
return [match autorelease]; /* Let match go and return it. */
}
是的,这是最好的方法。自动释放实际上仅适用于您知道的代码中的交互。一旦你存储了一个对象,你应该知道持有引用的对象不会死/超出范围,直到你也完成了该对象,或者你需要保留该对象。
仅保证自动释放的对象将在您的方法结束后释放。毕竟,调用您的方法的方法可以创建自己的池并在您的方法之后立即释放它。