【发布时间】:2011-08-11 15:08:07
【问题描述】:
据我了解,一旦释放了自动释放池,就会清除自动释放的对象。现在,自动释放池将在运行循环结束时释放。
我的问题是,如果在我的类中我没有创建自定义自动释放池并对该类中的某些对象调用 autorelease 方法,那么这些对象将在什么时候被恢复? “运行循环的结束”是否意味着“应用程序的结束”?
【问题讨论】:
标签: iphone objective-c cocoa-touch ios nsautoreleasepool
据我了解,一旦释放了自动释放池,就会清除自动释放的对象。现在,自动释放池将在运行循环结束时释放。
我的问题是,如果在我的类中我没有创建自定义自动释放池并对该类中的某些对象调用 autorelease 方法,那么这些对象将在什么时候被恢复? “运行循环的结束”是否意味着“应用程序的结束”?
【问题讨论】:
标签: iphone objective-c cocoa-touch ios nsautoreleasepool
您必须了解运行循环的概念。 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,
因此,在处理完每个触摸、动作或远程控制事件后,池将被清空。
【讨论】:
运行循环的“结束”是指运行循环每次迭代的结束,而不是应用程序的结束。
【讨论】:
不是真的。想象一下 RunLoop 有“圈子” :) 在每个“圈子”的开头,RunLoop 创建 Autorelease 池并在退出“圈子”之前将其排空。
【讨论】: