Objective c 有时我想阻止我的Cocoa应用程序启动,如何在init中阻止它?

Objective c 有时我想阻止我的Cocoa应用程序启动,如何在init中阻止它?,objective-c,cocoa,Objective C,Cocoa,我只想在加载笔尖之前尽快退出。我尝试了[NSApp-stop:self],但似乎不起作用。有没有更好的办法,比得到我的进程,并杀死它 (我知道这样做很奇怪。这是有充分理由的。)在不知道更多的情况下,我会说在调用NSApplicationMain之前将检查代码放入main() int main(int argc, char **argv) { if(shouldExit() == YES) { exit(exitCode); } return NS

我只想在加载笔尖之前尽快退出。我尝试了
[NSApp-stop:self]
,但似乎不起作用。有没有更好的办法,比得到我的进程,并杀死它


(我知道这样做很奇怪。这是有充分理由的。)

在不知道更多的情况下,我会说在调用
NSApplicationMain
之前将检查代码放入
main()

int main(int argc, char **argv)
{
    if(shouldExit() == YES)
    {
        exit(exitCode);
    }

    return NSApplicationMain(argc, (const char **) argv);
}
苹果文档。您也可以使用
forceTerminate
。您也可以使用nall的建议,但只有在您能够检查应用程序是否需要在
main()
中终止时,该建议才会起作用。否则,您需要按照我的建议做更多的事情。

这应该可以:

[[NSApplication sharedApplication] terminate: nil];

如果您可以轻松检测到想要退出,那么修改应用程序的
main()
功能是“最快”的地方:


你什么时候知道你想辞职?它可能在main()中吗?你需要加载插件吗?使用Cocoa框架?在任何人都能给你一个具体的答案之前,你需要更具体地了解你的情况。我曾考虑在我的应用程序delegates init方法中退出,但我可能可以在main中完成。调用此方法将初始化共享应用程序,因此至少会初始化MainMenu.nib(或调用应用程序的主菜单nib的任何内容)将被加载。不确定这是否重要,但在调用
NSApplicationMain()
之前是否应该排空池?还是没关系?我觉得没关系。NSApplicationMain只会将另一个自动释放池推送到池堆栈上。如前所述,如果NSApplicationMain()引发异常,则可能存在内存泄漏,这是正确的。由于该应用程序无论如何都会退出,所以这不是一个真正的问题。不过,我还是会修改的。@MarcW,如果shouldExit()创建了很多自动删除的对象,那么在调用NSApplicationMain之前清空池可能是有意义的,否则这些实例将一直挂到程序存在为止。如果
shouldExit()
使用Cocoa框架,由于没有
NSAutoreleasePool
,您可能会泄漏自动释放的对象。我很确定,当您可以调用此方法时,至少应用程序的主菜单NIB已经加载。在加载NIB之前,他可以从他的
nsapplicationedelegate
类调用它(例如从
应用程序willfinishLaunching
)。当您调用terminate时:它会确保您确实想要终止,这不适合我的任务。不过,它可能对其他人有用。
[[NSApplication sharedApplication] terminate: nil];
int main(int argc, char **argv)
{

  id pool = [[NSAutoreleasePool alloc] init]; //needed if shouldExit() uses Cocoa frameworks

 @try {
    if(shouldExit())  {
      exit(0); //appropriate exit code, depending on whether this "fast" exit is normal or exceptional
    }
  }
  @finally {
    [pool drain];
  }

  return NSApplicationMain(argc, (const char **) argv);;
}