【问题标题】: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 块。请给我一个简要的例子。

【问题讨论】:

标签: ios objective-c memory-management nsautoreleasepool


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2011-04-10
    • 2011-08-23
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多