2013-07-05 4 views
0

Поэтому мне нужно зарегистрировать функцию на OSX (используя Xcode/Object C), которая будет регистрировать определенную функцию, которая будет вызываться всякий раз, когда программа завершается.Зарегистрируйте функцию, которая будет вызываться непосредственно перед запуском программы

Я столкнулся с this, но я думаю, что это для iOS, а не для OSX.

Я заменил UI на NS и сделал снимок, но это не сработало.

NSApplication *app = [NSApplication sharedApplication]; 
[[NSNotificationCenter defaultCenter] 
addObserver:self 
selector:@selector(applicationWillTerminate:) 
name:BeCalledOnExit object:app]; 

но это не скомпилирование. он говорит что-то по имени: будучи необъявленным идентификатором, когда он явно находится на файле .h & .m перед функцией.

я столкнулся с другим парнем, который используется так:

-(BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *) sender{ 
return TRUE 
} 

, но он не работает для меня, как мое приложение является полным строке состояния приложения.

В основном я создаю временные файлы во время своего приложения и перед выходом из системы, я хочу убедиться, что мое приложение очищает эти файлы. Я помещаю его в/tmp /. Woudn't не хочет слишком много места для взятия.

я действительно хотел бы иметь решение, как в GCC/питона,

atexit(functionName); 
+1

Так почему бы не просто использовать atexit? Это простая функция C. – cody

+0

Использование NSApplicationWillTerminateNotification в имени –

+0

попытался atexit(), он жалуется во время выполнения об идентификаторе. –

ответ

6

Реализовать - (void)applicationWillTerminate:(NSNotification *)notification на вашем AppDelegate и она будет называться просто перед применением прекратит

So реализации Вашего AppDelegate может выглядеть примерно так:

@implementation AppDelegate 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    // Insert code here to initialize your application 
    NSLog(@"I FINISHED LAUNCHING!"); 
} 

- (void)applicationWillTerminate:(NSNotification *)notification 
{ 
    NSLog(@"I WILL TERMINATE NOW!!!"); 
} 
@end 
+0

Так что, если я закрою приложение с '[[NSApplication sharedApplication] terminate: nil]' в элементе меню состояния. Но если просто нажать кнопку остановки в Xcode/завершить процесс через монитор активности, это не сработает. –

+3

Уведомление 'applicationWillTerminate' отправляется только тогда, когда приложение выходит из« обычного »способа, описанные вами способы отправляют в приложение что-то вроде SIGTERM или SIGKILL, что не является запланированным способом выхода из приложения. Но я думаю, что вы можете реализовать некоторую обработку сигнала для этого, возможно, ответ на этот пост поможет: http://stackoverflow.com/questions/8100944/catch-app-terminate-from-launchdeamon – tttthomasssss

+0

Я думаю, что (-финализация) был обесценен в версии 10.8 (согласно документам). В любом случае спасибо за ссылку, я буду работать над попыткой поймать SIGTERM. –

0

Ваш App делегат должен реализовывать - (недействительными) applicationWillTerminate: (NSNotifica Тион *) уведомление, чтобы получить уведомление

(OR)

Вы можете реализовать applicationShouldTerminate и выполнить очистку ваших файлов и вернуть соответствующий NSApplicationTerminateReply, если ваши очистки не удается

0

Если вы хотите использовать уведомление, вы должны наблюдать NSApplicationWillTerminateNotification.

0
NSApplication *app = [NSApplication sharedApplication]; 
[[NSNotificationCenter defaultCenter] 
addObserver:self 
selector:@selector(applicationWillTerminate:) 
name: NSApplicationWillTerminateNotification object:app]; 
/*A notification named NSApplicationWillTerminateNotification.*/ 
- (void)applicationWillTerminate:(NSNotification *)notification 
{ 

} 
Смежные вопросы