所有Objective-C起始页面打开,主函数声明下有一个默认的@autoreleasepool{...}
语句。但这句话到底在做什么呢?新的Objective-C自动释放对象并删除该行不会对程序产生任何影响。这个命令真的有必要吗?
答案 0 :(得分:80)
@autoreleasepool
语句正在执行与以前相同的工作,而不是使用NSAutoreleasePool类。 NSAutoreleasePool的工作方式有点奇怪,因为创建它会在整个应用程序中产生影响; @autoreleasepool
创建了一个范围区域,使其更清晰地显示池中的内容以及它何时消失(当它超出范围时)。根据Apple的说法,它也更有效率。
自动释放池的概念很简单,只要对象实例被标记为自动释放(例如NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];
),它在那个时刻的保留计数为+1,但是在结束时运行循环,池被耗尽,任何标记为autorelease的对象都会使其保留计数减少。这是一种保持物体周围的方式,同时你准备任何可以保留它的东西。
使用ARC,虽然开发人员不使用autorelease
关键字,但管理ARC的基础系统会为您插入。 (请记住:所有ARC正在做的是在适当的时间为您插入retain
,release
和autorelease
来电。因此,现有的AutoreleasePool概念需要保持不变。
如果删除自动释放池,则对象将开始泄漏
在引用计数环境中,Cocoa期望有一个始终可用的自动释放池。如果池不可用,则自动释放的对象不会被释放并且您会泄漏内存。在这种情况下,您的程序通常会记录适当的警告消息。