发布和自动发布有啥区别,有啥方法可以创建用户定义的自动发布池? [复制]

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,retainreleaseautorelease 方法和 NSAutoreleasePool 类都消失了,编译器会为你做正确的事情。【参考方案2】:

release 会立即释放对象,而autorelease 会在未来某个时间释放。

示例:您想在此处返回一个autoreleased 对象,因为如果您要release 它,则在调用此方法的代码可以使用之前,它已经获得了dealloc返回的对象!

- (NSObject *)someMethod

    return [[[NSObject alloc] init] autorelease];

【讨论】:

你能告诉我这个对象自动释放是什么时候发生的吗?因为我没有调用任何版本,所以苹果如何识别对象的范围已经结束? @harikrishnan:自动释放(将其添加到池中)会立即发生。当池本身被释放/耗尽时,池会释放对象。当您自己执行此操作(针对您创建的池)或返回到应用程序的事件循环时,会发生这种情况。

以上是关于发布和自动发布有啥区别,有啥方法可以创建用户定义的自动发布池? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用以下 xib 方法 1 和方法 2 创建自定义单元格有啥区别? [复制]

Ruby 中的方法和消息有啥区别? [关闭]

c++类的问题:创建静态存储类对象和自动存储类对象有啥区别?能举例说明吗?谢谢

用户控件库和自定义控件库有啥区别?

Java中throw和throws有啥区别?

用户控件、自定义控件和组件有啥区别?