NSAutoreleasePool 和 @autoreleasepool 块有啥区别?

Posted

技术标签:

【中文标题】NSAutoreleasePool 和 @autoreleasepool 块有啥区别?【英文标题】:What is the difference between NSAutoreleasePool and @autoreleasepool block?NSAutoreleasePool 和 @autoreleasepool 块有什么区别? 【发布时间】:2014-05-07 09:22:17 【问题描述】:

我想知道 NSAutoreleasePool 和 @autoreleasepool 块之间有什么区别。我已经经历了很多问题,但没有得到任何令人满意的答案。直到现在我才知道在 ARC 中我们不能使用 NSAutoreleasePool和@autoreleasepool 块可以在ARC enabled and disabled 情况下使用。那么在哪些方面它们在内部以这种方式表现是不同的。

是否有必要在禁用弧的环境中释放对象,即使我们使用 NSAutoreleasePool 或 @autoreleasepool 块或者它们会自动释放?另外,如果 ARC 自动释放内存,那么我们为什么使用@autoreleasepool 块。请给我一个简要的例子。

【问题讨论】:

从文档中苹果说如果你使用 arc 你不能使用 NSAutoreleasePool 你必须使用@autoreleasepool。进一步了解developer.apple.com/library/mac/documentation/Cocoa/Reference/… 我在上面的链接中看到了这一点: -重要提示:如果您使用自动引用计数 (ARC),则不能直接使用自动释放池。相反,您使用 @autoreleasepool 块。 Why does Xcode 4.2 use @autoreleasepool in main.m instead of NSAutoreleasePool?的可能重复 @leo...链接给出的区别我已经在我的问题中提到过。我想知道这是唯一的区别还是还有其他区别。 【参考方案1】:

你提到的一个区别:

在 ARC 中我们不能使用 NSAutoreleasePool 和 @autoreleasepool 块可以 可在启用和禁用 ARC 的情况下使用。

但是对于你的这个声明:

另外,如果 ARC 自动释放内存,那么我们为什么要使用 @autoreleasepool 块

ARC 不会自动释放内存!这是一个编译时特性,每个对象都被发送一个autorelease,然后它进入本地池。一旦它的生命周期和范围结束,池操作系统就会释​​放自身,从而释放所有对象。

你可以参考这个博客Are @autoreleasepool Blocks More Efficient?

是否有必要在禁用电弧的环境中释放对象 即使我们使用 NSAutoreleasePool 或 @autoreleasepool 块 还是他们会自动完成?

是的您需要释放这些对象。根据(@/NS)autoreleasepool 的定义,它不处理您的对象保留计数,但仅用于以下用途:

自动释放池块提供了一种机制,您可以通过它放弃 一个对象的所有权,但避免它被 立即释放(例如当您从 方法)。

【讨论】:

感谢 Anoop 的回答。还有一个问题,即是否有必要在禁用弧的环境中释放对象,即使我们使用 NSAutoreleasePool 或 @autoreleasepool 块或它们会自动释放? 【参考方案2】:

NSAutoreleasePool 类用于支持 Cocoa 的引用计数内存管理系统。自动释放池存储在池本身耗尽时发送release 消息的对象。

另外,如果您使用自动引用计数 (ARC),则不能直接使用自动释放池。相反,您使用 @autoreleasepool 块。例如,代替:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Code benefitting from a local autorelease pool.
[pool release];

你会写:

@autoreleasepool 
    // Code benefitting from a local autorelease pool.

@autoreleasepool 块比直接使用NSAutoreleasePool 的实例更有效;即使您不使用 ARC,也可以使用它们。

您可以参考 Apple 文档了解更多详情:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html

【讨论】:

以上是关于NSAutoreleasePool 和 @autoreleasepool 块有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

目标 C - NSthread 和 NSAutoreleasePool?

使用 NSAutoreleasePool 和 NSURLConnection

在没有 NSAutoReleasePool 的情况下使用 autoReleased 对象?

NSRunLoop 和 NSAutoreleasePool,它们是如何交互的?

Objective C NSAutoreleasePool 和发布

如何使用 NSAutoreleasePool