发布和自动发布有啥区别,有啥方法可以创建用户定义的自动发布池? [复制]
Posted
技术标签:
【中文标题】发布和自动发布有啥区别,有啥方法可以创建用户定义的自动发布池? [复制]【英文标题】:what is the difference between release and auto release and is there any way to create a user defined autorelease pool? [duplicate]发布和自动发布有什么区别,有什么方法可以创建用户定义的自动发布池? [复制] 【发布时间】:2012-04-21 05:59:09 【问题描述】:可能重复:What is the difference between releasing and autoreleasing?
您好,请您详细说明发布和自动发布之间的区别,有什么方法可以创建用户定义的自动发布池?以及自动发布池的真正用途。
【问题讨论】:
这两个问题都不完全重复,这包括如何创建自己的池的主题。 【参考方案1】:Release 立即减少对象的引用计数,这意味着如果其保留计数达到零,它将立即被释放。自动发布是一种延迟发布——它对于所有权移交很有用。
考虑像+[NSString stringWithFormat:]
这样的方法。它创建一个新的NSString
实例(带有alloc
和某种形式的init
),然后将其交给调用者。该类方法不想在那之后仍然“拥有”创建的字符串,但是如果它在返回之前释放新字符串,则新字符串将在调用者获取它之前被释放。相反,它会自动释放新字符串:这意味着该字符串将停留足够长的时间,以便调用者抓住它并在需要时保留它。
如果调用者不保留它会怎样?这就是自动释放池发挥作用的地方。 NSAutoreleasPool
跟踪每个 autorelease
,当被告知要耗尽时,它会释放其池中的所有对象(如果它们的引用计数变为零,则会导致它们被释放)。默认情况下,在 Mac 或 ios 应用程序中,主事件循环中有一个自动释放池 - 因此,如果您调用 stringWithFormat:
并且不保留结果,它将在下一次传递时消失。
您可以使用NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]
创建自己的自动释放池,并使用[pool drain]
将其排空。如果您在一段代码中创建了大量临时对象,这将很有用。
【讨论】:
在现代代码中,应该使用@autoreleasepool
语句而不是创建 NSAutoreleasePool 对象。你不能因为不小心没有释放@autoreleasepool
而搞砸它——它会在代码说它会结束的时候结束。此外,现代代码应该真正使用 ARC 而不是保留/释放(这是默认的原因);使用 ARC,retain
、release
和 autorelease
方法和 NSAutoreleasePool 类都消失了,编译器会为你做正确的事情。【参考方案2】:
release
会立即释放对象,而autorelease
会在未来某个时间释放。
示例:您想在此处返回一个autorelease
d 对象,因为如果您要release
它,则在调用此方法的代码可以使用之前,它已经获得了dealloc返回的对象!
- (NSObject *)someMethod
return [[[NSObject alloc] init] autorelease];
【讨论】:
你能告诉我这个对象自动释放是什么时候发生的吗?因为我没有调用任何版本,所以苹果如何识别对象的范围已经结束? @harikrishnan:自动释放(将其添加到池中)会立即发生。当池本身被释放/耗尽时,池会释放对象。当您自己执行此操作(针对您创建的池)或返回到应用程序的事件循环时,会发生这种情况。以上是关于发布和自动发布有啥区别,有啥方法可以创建用户定义的自动发布池? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
使用以下 xib 方法 1 和方法 2 创建自定义单元格有啥区别? [复制]