在iPhone应用程序中调用exit(0)

adr*_*ian 5 iphone objective-c exit ios

在我的应用程序的某些时候,我已经完成了这个exit(0)崩溃我的应用程序.但我还没弄清楚在执行时调用哪种方法.

我把消息放入:

(void)applicationWillTerminate:(UIApplication *)application
(void)applicationDidEnterBackground:(UIApplication *)application
Run Code Online (Sandbox Code Playgroud)

但这一切似乎都没有被召唤!什么方法在exit(0)完成时被调用?

Jef*_*ski 20

来自Apple的人类用户指南......

不要以编程方式退出

永远不要以编程方式退出iOS应用程序,因为人们倾向于将其解释为崩溃.但是,如果外部环境阻止您的应用程序按预期运行,您需要告知用户有关情况并解释他们可以采取的措施.根据应用程序故障的严重程度,您有两种选择.

显示描述问题的有吸引力的屏幕并建议更正.屏幕提供反馈,向用户保证应用程序没有任何问题.它使用户可以控制,让他们决定是否要采取纠正措施并继续使用您的应用程序或按Home键并打开其他应用程序

如果只有部分应用程序功能不起作用,则在人员激活该功能时显示屏幕或警报.仅当人们尝试访问无法运行的功能时才显示警报.

如果你决定以编程方式退出...

在C中,exit(0)将停止执行应用程序.这意味着不会调用任何委托方法或异常处理程序.因此,如果目标是确保在关闭时调用某些代码,即使在强制关闭时,也可能有另一种选择.在您的AppDelegate实现中,一个名为的自定义方法-(void)applicaitonIsgoingAway.从您希望调用现有代码的任何地方调用此方法:

  1. applicationWillTerminate
  2. applicationDidEnterBackground
  3. onUncaughtException

前两个是您在问题中已经提到过的.第三种可以是各种各样的.它是一个全局异常处理程序.接下来的一点是关于这个主题的问题.

这个异常处理程序将被调用任何无法处理的异常(否则会导致应用程序崩溃).从这个处理程序中,您可以调用applicaitonIsgoingAway,就像在其他2个案例中一样.从我上面提到的另一个问题,你可以找到类似的答案.

void onUncaughtException(NSException* exception)
{
    [[AppDelegate sharedInstance] applicationIsgoingAway];
}
Run Code Online (Sandbox Code Playgroud)

但为了使其工作,您需要将此方法设置为异常处理程序,如此...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  NSSetUncaughtExceptionHandler(&onUncaughtException);
 //There may already be more code in this method.
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过调用以编程方式退出应用程序NSAssert(FALSE, @"Quitting the app programmatically.");只要没有其他异常处理程序来捕获它,您的应用程序将开始崩溃,并且将调用您的异常处理程序代码.转而打电话applicationIsGoingAway.


Dim*_*mme 9

当您致电时,exit(0)请立即终止您的申请.0是状态代码,表示成功终止.

没有其他方法被调用,你的应用程序就会死掉.

苹果不鼓励你在任何地方打电话退出.

  • @george:你没有.用户必须主动选择关闭应用程序. (4认同)

Mat*_*off 2

exit(0)是一个终止应用程序进程的 C 函数,因此不会调用任何应用程序委托方法,应用程序将立即被终止。Apple 强烈建议您不要退出您的应用程序,因为它对用户来说似乎已损坏。