我已阅读questions/559482/why-doesnt-an-iphone-apps-main-function-ever-get-a-chance-to-finish,其中解释了NSApplicationMain
永远不会实际返回的原因。同样的事情(出于同样的原因)在桌面可可应用程序中发生,这正是我正在进行的工作。
考虑到这一点,当我的应用程序退出时,如何使用NSLog
输出一些最终调试消息?
具体来说,我想做这样的事情:
int myDebugVariable = 0;
int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
CMLog(@"application begin");
int exitCode = NSApplicationMain(argc, (const char **) argv);
CMLog(@"application end. Debugging variable = %d", myDebugVariable);
[pool release];
return exitCode;
}
在此示例中,“应用程序开始”行打印到控制台,但“应用程序结束”。行不是。
注意#1:在我的实际代码中,我使用的内容比myDebugVariable
更复杂。这是一个简化的例子,说明了我想要实现的效果。
注意#2:我熟悉ApplicationWillTerminate
方法,该方法在应用程序即将退出时被调用,但它不符合我的需要。我的调试代码依赖于某些自定义类的dealloc
方法,因此在调用ApplicationWillTerminate
之后它才会发挥作用。
更新
Adam Rosenfield's answer成功了。为了完整起见,这是一个有效的解决方案:
int myDebugVariable = 0;
void my_exit_handler(void)
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
CMLog(@"application end: Debugging variable = %d", myDebugVariable);
[pool release];
}
int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
CMLog(@"application begin");
atexit(my_exit_handler);
int exitCode = NSApplicationMain(argc, (const char **) argv);
[pool release];
return exitCode;
}
答案 0 :(得分:3)
使用atexit(3)
注册退出处理程序。当您的应用退出时,无论是通过完成主要还是通过调用exit(3)
,都会自动调用它。例如:
void my_exit_handler(void)
{
NSLog(@"about to exit, x = %d\n", x);
}
// at some point during app initialization...
atexit(&my_exit_handler);