考虑以下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()
应该如何工作,或者至少在他们的机器上确认相同的行为?
最初的问题是:" 为什么iPhone应用程序的main()函数没有机会完成? "
简答:因为UIApplicationMain()编码使得它永远不会返回.
在Simulator和设备上进行了几次测试,并要求其他开发人员进行相同的测试后,我确认UIApplicationMain永远不会返回.当用户通过点击Home按钮正常终止应用程序时,程序最终会在名为_terminateWithStatus的未发布的UIApplication方法内终止.此方法调用exit(0).
此行为与NSApplicationMain函数(UIApplicationMain函数的AppKit/Cocoa版本)相匹配.NSApplicationMain()的文档明确指出它永远不会返回.
我向Apple提交了一个错误(6600198),要求更正官方文档(以及main.m的Xcode模板)以声明UIApplicationMain()永远不会返回.虽然这不是一个功能性问题,但当前的模板和文档具有误导性.
感谢大家的所有投入和头脑风暴!