Release 会立即减少对象的引用计数,这意味着如果它的保留计数达到零,它将立即被释放。Autorelease 是一个延迟发布——它对于所有权移交很有用。
考虑一个类似的方法+[NSString stringWithFormat:]
。它创建一个新NSString
实例(带有alloc
& 的某种形式init
),然后将其交给调用者。该类方法不想在那之后仍然“拥有”创建的字符串,但是如果它在返回之前释放新字符串,则新字符串将在调用者获取它之前被释放。相反,它会自动释放新字符串:这意味着该字符串将保留足够长的时间,以便调用者抓住它并在需要时保留它。
如果调用者不保留它会发生什么?这就是自动释放池发挥作用的地方。NSAutoreleasPool
跟踪 each ,当autorelease
被告知要耗尽时,它会释放其池中的所有对象(如果它们的引用计数变为零,则会导致它们被释放)。默认情况下,在 Mac 或 iOS 应用程序中,主事件循环中有一个自动释放池——因此,如果您调用stringWithFormat:
并且不保留结果,它将在下一次传递时消失。
您可以使用创建自己的自动释放池NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]
并使用[pool drain]
. 如果您有一段代码要创建大量临时对象,这将很有用。