Cli*_*ris 9 iphone objective-c
考虑以下main()方法,您可以找到大多数iPhone应用程序:
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}Run Code Online (Sandbox Code Playgroud)
在我使用这些模拟器运行的每个iPhone应用程序中(包括Apple提供的几个示例项目),线程永不退出UIApplicationMain(),任何剩余的代码main()永远不会被执行.这是预期的行为吗?
我已经UIApplicationMain()通过使用调试器逐步执行代码来验证从未运行过的语句.当用户停止应用程序时(例如,通过点击"主页"按钮),生成的堆栈跟踪显示 [UIApplication _terminateWithStatus:]最终被调用.此函数调用应用程序委托的applicationWillTerminate:方法.一旦完成,[UIApplication _terminateWithStatus:]似乎杀死/退出线程.
有人可以确认这是main()应该如何工作,或者至少在他们的机器上确认相同的行为?
Cli*_*ris 19
最初的问题是:" 为什么iPhone应用程序的main()函数没有机会完成? "
简答:因为UIApplicationMain()编码使得它永远不会返回.
在Simulator和设备上进行了几次测试,并要求其他开发人员进行相同的测试后,我确认UIApplicationMain永远不会返回.当用户通过点击Home按钮正常终止应用程序时,程序最终会在名为_terminateWithStatus的未发布的UIApplication方法内终止.此方法调用exit(0).
此行为与NSApplicationMain函数(UIApplicationMain函数的AppKit/Cocoa版本)相匹配.NSApplicationMain()的文档明确指出它永远不会返回.
我向Apple提交了一个错误(6600198),要求更正官方文档(以及main.m的Xcode模板)以声明UIApplicationMain()永远不会返回.虽然这不是一个功能性问题,但当前的模板和文档具有误导性.
感谢大家的所有投入和头脑风暴!
| 归档时间: |
|
| 查看次数: |
7632 次 |
| 最近记录: |