在程序退出之前注册要调用的函数

Win*_*ron 0 macos cocoa objective-c

因此,我需要在OSX上注册一个函数(使用Xcode/objective C),该函数将在程序终止时注册要调用的特定函数.

我碰到了这个,但我猜这是适用于iOS而不适用于OSX.

我用NS替换了UI并给了它一个镜头,但它没有用.

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

但这不是编译.它在名称上说了一些东西:当它在函数之前明显位于.h和.m文件时,是一个未声明的标识符.

我遇到另一个用过这个的小伙子:

-(BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *) sender{
return TRUE
}
Run Code Online (Sandbox Code Playgroud)

但它不适合我,因为我的应用程序是一个完整的状态栏应用程序.

基本上我在我的应用程序中创建一些临时文件,在退出之前,我想确保我的应用程序正在清除这些文件.我把它放在/ tmp/..不想要太多空间.

我真的想要一个像gcc/python这样的解决方案,

atexit(functionName);
Run Code Online (Sandbox Code Playgroud)

ttt*_*sss 6

- (void)applicationWillTerminate:(NSNotification *)notification在AppDelegate上实现,它将在应用程序终止之前调用

因此,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
Run Code Online (Sandbox Code Playgroud)

  • 只有在应用程序退出"正常"方式时,才会发送`applicationWillTerminate`通知,您描述的方式会向您的应用程序发送SIGTERM或SIGKILL之类的内容,这不是退出应用程序的计划方式.但我认为你可以实现一些信号处理,也许这篇文章的答案是有帮助的:http://stackoverflow.com/questions/8100944/catch-app-terminate-from-launchdeamon (3认同)