autorelease什么时候真的会在Cocoa Touch中导致发布?

我知道你需要小心iOS上的autorelease 。 我有一个返回一个对象时,它的方法alloc是由主叫方需要S,所以在这种情况下-我的理解是-我需要发送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它来声明所有权。

有关正确使用autorelease需要知道的所有内容,请参阅内存管理指南。


这是Apple Memory Management文档中提供的一个例子:

– (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. */ 
}
链接地址: http://www.djcxy.com/p/53265.html

上一篇: When does autorelease actually cause a release in Cocoa Touch?

下一篇: NSString property: copy or retain?