据我所知,一旦释放自动释放的池,就会清理自动释放的对象。现在,自动释放池将在运行循环结束时释放。
我的问题是,如果在我的课程中,我没有创建自定义自动释放池并在该类中的某些对象上调用autorelease方法,那么这些对象将在何时被恢复? “运行循环结束”是否意味着“应用程序结束”?
答案 0 :(得分:21)
您必须了解运行循环的概念。 iOS中的运行循环等待某些事件发生,然后它就会对其起作用。该事件可能是用户触摸屏幕,接听电话等等。
对于iOS处理的每个此类事件,都会在开头创建 new 自动释放池,并在事件处理完成时将其耗尽。从理论上讲,Cocoa Touch可以创建任意数量的嵌套自动释放池,但您应该知道的主要是事件循环。
也许来自Application Life Cycle的图表会有所帮助。
在伪代码中,归结为
int UIApplicationMain(...) {
while (!shouldQuitApplication) {
Event *someEvent = // wait for next event;
NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
// handle event
[myPool release];
}
}
这些是iOS中的事件类型
UIEventTypeTouches,
UIEventTypeMotion,
UIEventTypeRemoteControl,
因此,在处理完所有触摸,动作或远程控制事件后,池将被耗尽。
答案 1 :(得分:3)
运行循环的“结束”表示运行循环的每次迭代结束,而不是应用程序的结束。
答案 2 :(得分:0)
不是真的。想象一下RunLoop有“圈子”:)在每个“圈子”的开头,RunLoop创建自动释放池并在退出“圈子”之前将其排出。