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,它们是如何交互的?