如何在main()中使用NSLog,但在NSApplicationMain之外?

时间:2009-06-19 02:26:02

标签: cocoa logging

我已阅读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;
}

1 个答案:

答案 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);