我有一个关于自动释放的问题,现在我有下面的代码:
int main(int argc, char *argv[]){
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}}
文档说在@autoreleasepool{}的末尾,标记为autorelease的对象将收到一个释放消息。但是UIApplicationMain永远不会返回,这意味着流永远不会到达@autoreleasepool的末端,然后标记为autorelease的对象永远不会得到释放,直到应用程序死亡。没有自动释放的意义.....
我问了一个说iOS系统会生成一些线程的人,(你知道,一个线程,一个运行循环)。他说运行循环将创建自动释放池。所以autorelease对象会在语句头或运行循环结束时释放。但大多数情况下我们使用主线程。所以他说的话说服不了我。
什么时候使用自动释放是合适的。这让我困惑了很长时间。
我得到另一个点,自动释放对象将获得释放时,一个运行循环结束(主运行循环将存在所有的应用程序的生命??),所以我不确定…
有任何观点和相关文件将不胜感激!!
是的,从技术上讲,UIApplicationMain
永远不会返回,所以它永远不会到达@autoreleasepool
块的末尾,所以在这种情况下,如果你删除了@autoreleasepool
块,它不会有什么区别(除了可能抱怨它们在没有自动释放池的情况下被自动释放)。然而,可以想象一个main
函数并不总是调用UIApplicationMain
(也许不是在iOS应用程序中,但在一般情况下);那就不一样了。
在每个线程的入口点的主体周围总是放置一个@autoreleasepool
块,main
是主线程的入口点,这是一个很好的做法。因此,为了保持一致性,总是把它放在那里是有意义的。
你所交谈的人正在谈论的是在UIApplicationMain
内部,有一个运行循环(处理事件的无限循环),并且在每个迭代中有一个自动释放池(或者可能每隔几个迭代;这是一个实现细节)。这与main
中的自动释放池无关。