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);;
}