考虑以下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()
切勿通过使用调试器单步执行代码来运行。当用户停止应用程序时(例如,通过点击“Home”按钮),生成的堆栈跟踪显示:[UIApplication _terminateWithStatus:]
最终被调用。该函数调用您的应用程序委托applicationWillTerminate:
方法。一旦完成,[UIApplication _terminateWithStatus:]
似乎杀死/退出线程。
有人可以确认这是怎么回事吗main()
应该可以工作,或者至少确认他们的机器上有相同的行为?
最初的问题是:“为什么 iPhone 应用程序的 main() 函数没有机会完成?"
简短回答:因为 UIApplicationMain() 的编码使其永远不会返回。
在模拟器和设备上进行了多次测试,并要求另一位开发人员进行相同的测试后,我确认 UIApplicationMain 永远不会返回。当用户通过点击 Home 按钮正常终止应用程序时,该程序最终在一个名为 _terminateWithStatus 的未发布的 UIApplication 方法中终止。该方法调用 exit(0)。
此行为与 NSApplicationMain 函数(这是 UIApplicationMain 函数的 AppKit/Cocoa 版本)的行为相匹配。 NSApplicationMain() 的文档明确指出它永远不会返回。
我已向 Apple 提交了一个错误 (6600198),要求更正官方文档(以及 main.m 的 Xcode 模板)以声明 UIApplicationMain() 永远不会返回。虽然这不是功能问题,但当前的模板和文档具有误导性。
感谢大家的投入和集思广益!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)