什么是autoreleasepool?

可能重复:
为什么使用Autorelease池?

所有的Objective-C起始页面都在主函数声明下面打开一个默认的@autoreleasepool{...}语句。 但是这个陈述究竟在做什么呢? 新的Objective-C自动释放对象并删除行不会改变程序。 这个命令真的有必要吗?

@autoreleasepool语句与以前一样执行相同的工作,而不是使用NSAutoreleasePool类。 NSAutoreleasePool的工作方式有点奇怪,因为创build它会在整个应用程序中产生效果; @autoreleasepool创build一个有作用域的区域,使得它更清晰的是什么在池内,当它耗尽(当它超出范围)。 根据苹果的说法,这样做效率也更高。

autorelease池的概念很简单,只要一个对象实例标记为autoreleased(例如NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease]; ),它将有一个保留计数+ 1,但是在运行循环结束时,池被排空,并且任何标记为自动释放的对象都将其保留计数递减。 这是一种保持对象的方式,而你准备将自己保留的东西。

使用ARC,尽pipe开发人员不使用autorelease关键字,但pipe理ARC的基础系统会为您插入。 ( 切记:所有ARC正在做的是在适当的时候为你插入retainreleaseautorelease呼叫)。 正因为如此,现有的AutoreleasePool概念需要停留在周围。

如果您删除autorelease池,您的对象将开始泄漏

在一个参考计数的环境中,Cocoa希望有一个始终可用的自动释放池。 如果一个池不可用,自动释放的对象不会被释放,并且会泄漏内存。 在这种情况下,您的程序通常会logging适当的警告消息。