可能重复:
What is the difference between releasing and autoreleasing?
您好,请详细说明发布和自动发布之间的区别,是否有任何方法可以创建用户定义的自动释放池?以及自动发布池的实际用途。
答案 0 :(得分:4)
Release会立即减少对象的引用计数,这意味着如果其保留计数达到零,它将立即被释放。 Autorelease是一个延迟发布 - 它对所有权交付有用。
考虑像+[NSString stringWithFormat:]
这样的方法。它会创建一个新的NSString
实例(使用alloc
&某种形式的init
),然后将其移交给调用者。该类方法不希望在此之后“拥有”创建的字符串,但如果它在返回之前释放新字符串,则新字符串将在调用者获取之前被释放。相反,它会自动释放新的字符串:这意味着字符串会长时间停留,以便调用者抓住它并在需要时保留它。
如果来电者不保留会怎样?这就是自动释放池发挥作用的地方。 NSAutoreleasPool
跟踪每个autorelease
,当被告知要排空时,它释放其池中的所有对象(如果它们的引用计数变为零,则导致它们被释放)。默认情况下,在Mac或iOS应用程序中,主事件循环中有一个自动释放池 - 因此,如果您调用stringWithFormat:
并且不保留结果,它将在下一次传递时消失。
您可以使用NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]
创建自己的自动释放池,并将其排除在[pool drain]
之后。如果您有一段代码要创建大量临时对象,这将非常有用。
答案 1 :(得分:0)
release
会立即释放该对象,而autorelease
将来会有一段时间。
示例:您希望在此处返回autorelease
d对象,因为如果您release
它,它将在调用此代码之前获取dealloc方法可以使用返回的对象!
- (NSObject *)someMethod
{
return [[[NSObject alloc] init] autorelease];
}