NSAutoreleasePool和@autoreleasepool块有什么区别?

时间:2014-05-07 09:22:17

标签: ios objective-c memory-management nsautoreleasepool

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

是否有必要在禁用弧的环境中释放对象,即使我们使用的是 NSAutoreleasePool 或@autoreleasepool块,或者他们会自动执行此操作?此外,如果ARC自动释放内存,那么我们使用的原因 @autoreleasepool 阻止。请举例说明。

2 个答案:

答案 0 :(得分:7)

你提到的一个区别是:

  

在ARC中我们不能使用NSAutoreleasePool和@autoreleasepool块   用于ARC启用和禁用情况。

但是对于你的这句话:

  

此外,如果ARC自动释放内存,那么我们使用的原因   @autoreleasepool block

ARC不会自动释放内存!这是一个编译时功能,每个对象都发送一个autorelease并转到本地池。一旦其生命周期和范围结束,池操作系统将自行释放,从而释放所有对象。

您可以参考此博客Are @autoreleasepool Blocks More Efficient?

  

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

您需要释放对象。根据{{​​1}}的定义,它不处理您的对象保留计数,但它仅用于以下内容:

  

自动释放池块提供了一种可以放弃的机制   对象的所有权,但避免它的可能性   立即解除分配(例如当你从一个物体返回一个物体时)   法)。

答案 1 :(得分: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