当前位置:  开发笔记 > IOS > 正文

为什么iPhone应用程序的main()函数没有机会完成?

如何解决《为什么iPhone应用程序的main()函数没有机会完成?》经验,为你挑选了1个好方法。

考虑以下main()方法,您可以找到大多数iPhone应用程序:

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

在我使用这些模拟器运行的每个iPhone应用程序中(包括Apple提供的几个示例项目),线程永不退出UIApplicationMain(),任何剩余的代码main()永远不会被执行.这是预期的行为吗?

我已经UIApplicationMain()通过使用调试器逐步执行代码来验证从未运行过的语句.当用户停止应用程序时(例如,通过点击"主页"按钮),生成的堆栈跟踪显示 [UIApplication _terminateWithStatus:]最终被调用.此函数调用应用程序委托的applicationWillTerminate:方法.一旦完成,[UIApplication _terminateWithStatus:]似乎杀死/退出线程.

有人可以确认这是main()应该如何工作,或者至少在他们的机器上确认相同的行为?



1> Clint Harris..:

最初的问题是:" 为什么iPhone应用程序的main()函数没有机会完成? "

简答:因为UIApplicationMain()编码使得它永远不会返回.

在Simulator和设备上进行了几次测试,并要求其他开发人员进行相同的测试后,我确认UIApplicationMain永远不会返回.当用户通过点击Home按钮正常终止应用程序时,程序最终会在名为_terminateWithStatus的未发布的UIApplication方法内终止.此方法调用exit(0).

此行为与NSApplicationMain函数(UIApplicationMain函数的AppKit/Cocoa版本)相匹配.NSApplicationMain()的文档明确指出它永远不会返回.

我向Apple提交了一个错误(6600198),要求更正官方文档(以及main.m的Xcode模板)以声明UIApplicationMain()永远不会返回.虽然这不是一个功能性问题,但当前的模板和文档具有误导性.

感谢大家的所有投入和头脑风暴!


更新:我很高兴地报告Apple修改了UIApplicationMain()的官方文档并关闭了我的bug.文档现在包括以下内容:即使指定了整数返回类型,此函数也不会返回.当用户通过按Home键终止iPhone应用程序时,应用程序会立即通过调用退出系统函数退出,参数为零.
推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有