Я прочитал Вопросы / 559482 / Почему-то-не-iPhone-приложений-Основные-функции-когда-либо-получить-шанс-до-конца , что объясняет, почему 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
.
Обновление:
Ответ Адама Розенфилда добился цели. Для полноты, вот рабочее решение:
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;
}