Objective c 什么是自动释放池?
可能重复:Objective c 什么是自动释放池?,objective-c,object,release,autorelease,nsautoreleasepool,Objective C,Object,Release,Autorelease,Nsautoreleasepool,可能重复: 打开所有Objective-C起始页时,在主函数声明下会出现默认的@autoreleasepool{…}语句。但这句话到底在做什么?新的Objective-C自动释放对象,删除行不会改变程序。这个命令真的有必要吗?这个@autoreleasepool语句正在做与以前相同的工作,而不是使用类。NSAutoreleasePool的工作方式有点奇怪,因为创建它会在整个应用程序中产生影响@autoreleasepool创建一个作用域区域,并使其更清楚地显示池内的内容以及当其耗尽时(当其超出
打开所有Objective-C起始页时,在主函数声明下会出现默认的
@autoreleasepool{…}
语句。但这句话到底在做什么?新的Objective-C自动释放对象,删除行不会改变程序。这个命令真的有必要吗?这个@autoreleasepool
语句正在做与以前相同的工作,而不是使用类。NSAutoreleasePool的工作方式有点奇怪,因为创建它会在整个应用程序中产生影响@autoreleasepool
创建一个作用域区域,并使其更清楚地显示池内的内容以及当其耗尽时(当其超出作用域时)。据苹果公司称,它的效率也更高
自动释放池的概念很简单,每当对象实例被标记为自动释放时(例如NSString*str=[[NSString alloc]initWithString:@“hello”]autorelease];
),此时它的保留计数将为+1,但在运行循环结束时,池将被耗尽,任何标记为autorelease的对象都会减少其保留计数。这是一种在你准备任何东西的时候保持物体在周围的方法,这样你就可以把它保留下来
对于ARC,虽然开发者不使用autorelease
关键字,但管理ARC的底层系统会为您插入该关键字。(记住:ARC所做的一切就是在适当的时候为您插入保留
,释放
和自动释放
)。因此,现有的AutoreleasePool概念需要保留
如果删除自动释放池,对象将开始泄漏
在引用计数环境中,Cocoa希望有一个始终可用的自动释放池。如果池不可用,则不会释放自动释放的对象,并且会泄漏内存。在这种情况下,您的程序通常会记录适当的警告消息
或者标题信息:这是否意味着如果我使用ARC并从
@autoreleasepool{}
之外的某个地方释放对象,该对象在@autoreleasepool块结束之前仍然存在?如果手动释放自动释放的对象,当您到达自动释放池的末尾时,dealloc对象将不再存在,并且您将在框架或机器代码中的某个地方遇到异常。如果这是一条很长的代码路径,那么你的应用程序可能会在看似无关的地方崩溃,造成混乱。