发布和自动发布有什么区别,有没有办法创建用户定义的自动释放池?

时间:2012-04-21 05:59:09

标签: iphone objective-c cocoa

  

可能重复:
  What is the difference between releasing and autoreleasing?

您好,请详细说明发布和自动发布之间的区别,是否有任何方法可以创建用户定义的自动释放池?以及自动发布池的实际用途。

2 个答案:

答案 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];
}