autorelease和runloop和线程的关系?

时间:2013-03-29 06:28:34

标签: ios nsthread autorelease nsautoreleasepool runloop

我对自动释放有疑问,现在我有以下代码:

int main(int argc, char *argv[]){
@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}}

doc在@autoreleasepool {}结尾处说标记为autorelease的对象将收到一条释放消息。但是UIApplicationMain永远不会返回,这意味着流程永远不会到达@autoreleasepool的末尾,那么标记为autorelease的对象将永远不会释放,直到应用程序死掉。自动释放没有意义.....

我问过一个人,他说iOS系统会产生一些线程,(你知道,一个线程,一个runloop)。他说runloop会创建自动释放池。所以autorelease对象将在最后发布thead或runloop。但是大多数情况下我们都使用主线程。所以他所说的并不能说服我。

什么是使用自动释放的适当时间。我困惑了很长时间。

我得到另一个观点,当一个runloop结束时,autorelease对象将被释放(主runloop将存在所有应用程序的生命?)所以我不确定..

任何一点和相关文件将不胜感激!!

1 个答案:

答案 0 :(得分:5)

是的,从技术上讲,UIApplicationMain永远不会返回,因此它永远不会到达@autoreleasepool块的末尾,所以在这种情况下如果删除了@autoreleasepool块,它就没有区别(除了可能抱怨他们已经自动释放而没有自动释放池的事情。但是,可以想象一个main函数以不总是调用UIApplicationMain的方式编写(可能不在iOS应用程序中,但一般而言);那会有所作为。

优良作法是始终在每个线程的入口点的主体周围放置@autoreleasepool块,main是主线​​程的入口点。所以为了保持一致性,总是把它放在那里是有意义的。

你谈到的人在谈论的是UIApplicationMain内部,有一个运行循环(处理事件的无限循环),并且在每次迭代中都有一个自动释放池(或者每隔几次迭代) ;这是一个实现细节)。这与main中的自动释放池无关。