我想知道NSAutoreleasePool和@autoreleasepool block之间有什么区别。我已经经历了一些问题,但没有得到任何令人满意的答案。到目前为止我才知道在ARC中我们不能使用NSAutoreleasePool和@autoreleasepool块可以在ARC enabled and disabled
两种情况下使用。所以它们在内部有什么不同,以这种方式表现。
是否有必要在禁用弧的环境中释放对象,即使我们使用的是 NSAutoreleasePool 或@autoreleasepool块,或者他们会自动执行此操作?此外,如果ARC自动释放内存,那么我们使用的原因 @autoreleasepool 阻止。请举例说明。
答案 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文档了解更多详情: