什么是autoreleasepool?

mor*_*y95 58 release object objective-c autorelease nsautoreleasepool

可能重复:
为什么要使用自动释放池?

将打开所有Objective-C起始页面,其中包含@autoreleasepool{...}main函数声明下的默认语句.但这句话到底在做什么呢?新的Objective-C自动释放对象并删除该行不会对程序产生任何影响.这个命令真的有必要吗?

WDU*_*DUK 82

@autoreleasepool语句与以前完成相同的工作,而不是使用NSAutoreleasePool类.NSAutoreleasePool的工作方式有点奇怪,因为创建它会在整个应用程序中产生影响; @autoreleasepool创建一个范围区域,使其更清晰地显示池内的内容和排水时(当它超出范围时).据Apple称,它的效率也更高.

自动释放池的概念很简单,只要对象实例被标记为自动释放(例如NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];),它在该时刻将具有+1的保留计数,但是在运行循环结束时,池被耗尽,并且任何标记为自动释放的对象都会使其保留计数减少.它是一种保持物体的方式,同时你准备任何可以保留它的东西.

使用ARC,虽然autorelease开发人员不使用关键字,但管理ARC的基础系统会为您插入.(请记住:所有ARC正在插入retain,releaseautorelease在适当的时候呼叫你).因此,现有的AutoreleasePool概念需要保持不变.

如果删除自动释放池,则对象将开始泄漏

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

  • 如果您手动释放自动释放的对象,当您到达自动释放池的末尾时,dealloc'd对象将不再存在,您将在框架或机器代码中的某个位置遇到异常.如果这是一个很长的代码路径,你的应用程序似乎会在一个看似无关的地方崩溃,造成混乱. (2认同)