在iPhone应用中调用exit(0)

6
在我的应用程序中,我曾经执行过exit(0)操作,导致我的应用程序崩溃。但我还没有找出这个操作执行时调用了哪个方法。
我已经添加了一些消息:
(void)applicationWillTerminate:(UIApplication *)application
(void)applicationDidEnterBackground:(UIApplication *)application

但是似乎没有任何一个方法被调用!你知道当执行exit(0)时会调用哪个方法吗?


请查看此问题:https://dev59.com/bHRC5IYBdhLWcg3wROzk - Michał Zygar
5个回答

24

根据 Apple 的人类用户指南...

不要程序化地退出

永远不要通过编程方式退出 iOS 应用程序,因为人们往往会把它解释为应用程序崩溃。然而,如果外部情况阻止您的应用程序按预期运行,您需要告知用户有关该情况并解释他们可以采取什么措施。根据应用程序故障的严重程度,您有两个选择。

显示一个吸引人的屏幕来描述问题并建议纠正方法。屏幕提供反馈,让用户放心地知道您的应用程序没有问题。它让用户掌握了控制权,让他们决定是否要采取纠正措施并继续使用您的应用程序,或者按下 Home 按钮打开另一个应用程序。

如果只有某些应用程序功能不起作用,请在人们激活该功能时显示屏幕或警报。只有当人们尝试访问未能运行的功能时才显示警报。

如果您已经决定要程序化退出...

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

  1. applicationWillTerminate
  2. applicationDidEnterBackground
  3. onUncaughtException

前两个是您已经在问题中提到的。第三个可以作为全局异常处理程序。这下面的内容来自一个关于该主题的问题

此异常处理程序将针对任何未处理的异常(否则会导致应用程序崩溃)而被调用。从此处理程序中,您可以像在其他 2 种情况下一样调用 applicaitonIsgoingAway。从我上面提到的其他问题中,您可以找到类似于这个答案的答案。

void onUncaughtException(NSException* exception)
{
    [[AppDelegate sharedInstance] applicationIsgoingAway];
}

但为了使这个方法起作用,你需要将它设置为异常处理程序,如下所示...

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

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


1
所引用的苹果参考资料已不再包含在最新的苹果 HIG 中:https://developer.apple.com/design/human-interface-guidelines/ios/overview/interface-essentials/ - Native_Mobile_Arch_Dev
@Native_Mobile_Arch_Dev:你的意思是说,现在如果应用程序使用exit(0),他们就可以了吗? - Tejas K
1
嗨@TejasK - 实际上,我没有暗示任何事情,在这种情况下也不能做出任何推断。我只是断言引用的苹果公司参考资料已不再包含在最新的苹果公司HIG中。 - Native_Mobile_Arch_Dev

10

当你调用 exit(0) 时,你会立即终止你的应用程序。0 是一个状态码,表示成功终止。

没有其他方法被调用,你的应用程序就直接结束了。因此,最终用户可能会认为应用程序崩溃了。

苹果公司不建议在任何地方调用 exit。


那么我如何以推荐的方式,但是通过编程的方式退出我的应用程序呢? - adrian
4
@george:你无法强制关闭应用程序,用户必须主动选择关闭它。 - dimme
当我调用exit(0)(仅用于测试,我知道这是不允许/推荐的),应用程序仍然显示在后台应用程序列表中。 - Siriss

2

exit(0) 是一个C函数,它终止应用程序的进程,因此不会调用任何应用程序代理方法,应用程序将立即被终止。苹果强烈建议您的应用程序不要退出,因为这会给用户留下应用程序出现故障的印象。


0

没有苹果支持的方法可以通过编程方式终止您的应用程序。调用exit肯定是不可行的。这会导致各种各样的错误(例如多任务切换器将严重破坏),并且根本是错误的。

如果您想禁用多任务处理,可以在Info.plist文件中使用UIApplicationExitsOnSuspend键来实现(该键的标题为“应用程序不在后台运行”)。

除此之外,让您的用户按下主屏幕按钮来关闭您的应用程序。


1
调用 exit(0) 有其合理的使用场景。应用程序的一部分运行时可能会崩溃(例如,在使用 Mono 的应用程序中),Obj-C 代码所能采取的唯一安全措施是记录错误并立即退出。 - Slipp D. Thompson

-5
这些方法将被调用,但您不能使用 exit(0) 命令。您需要按返回按钮关闭应用程序,然后这些方法才会被调用。

4
返回按钮关闭应用程序?这不是安卓系统。 - Maciej Swic
我的陈述是正确的,只是因为我称其为“返回按钮”并不改变这一事实。你不能使用“exit 0”,唯一关闭应用程序的方法是使用物理按钮(无论你想如何称呼它)。 - owen gerig
3
抱歉,您的陈述不正确,因为该按钮的名称是“主页”按钮,而不是“返回”按钮。 - Maciej Swic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接