Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 什么是自动释放池?_Objective C_Object_Release_Autorelease_Nsautoreleasepool - Fatal编程技术网

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对象将不再存在,并且您将在框架或机器代码中的某个地方遇到异常。如果这是一条很长的代码路径,那么你的应用程序可能会在看似无关的地方崩溃,造成混乱。