【问题标题】:call exit(0) in iphone app在 iPhone 应用程序中调用 exit(0)
【发布时间】:2012-01-19 11:01:24
【问题描述】:

在我的应用程序的某个时刻,我已经完成了这个exit(0),它使我的应用程序崩溃。但是我还没弄清楚这个执行时会调用什么方法。

我已将消息放入:

(void)applicationWillTerminate:(UIApplication *)application
(void)applicationDidEnterBackground:(UIApplication *)application

但这些似乎都没有被调用!知道exit(0) 完成后会调用什么方法吗?

【问题讨论】:

标签: ios iphone objective-c exit


【解决方案1】:

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

不要以编程方式退出

永远不要以编程方式退出 iOS 应用程序,因为人们倾向于 将此解释为崩溃。但是,如果外部环境阻止 您的应用程序无法按预期运行,您需要告诉您的 用户了解情况并解释他们可以做些什么。 根据应用程序故障的严重程度,您有两个 选择。

显示一个有吸引力的屏幕来描述问题并提出建议 更正。屏幕提供反馈,让用户放心 你的申请没有问题。它让用户控制, 让他们决定是否要采取纠正措施,以及 继续使用您的应用程序或按主页按钮并打开一个 不同的应用

如果您的应用程序的某些功能无法正常工作,请显示 当人们激活该功能时,屏幕或警报。展示 仅当人们尝试访问未使用的功能时才发出警报 功能正常。

如果您决定无论如何都要以编程方式退出...

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

  1. applicationWillTerminate
  2. applicationDidEnterBackground
  3. onUncaughtException

前两个是您在问题中已经提到的。第三个可以是各种各样的。它是一个全局异常处理程序。下一位来自question on that very topic

此异常处理程序将被调用以处理任何未处理的异常(否则会使您的应用程序崩溃)。在此处理程序中,您可以调用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

【讨论】:

  • 引用的 Apple 参考文献不再包含在最新的 Apple HIG 中:developer.apple.com/design/human-interface-guidelines/ios/…
  • @Native_Mobile_Arch_Dev:你的意思是说,如果应用程序正在使用 exit(0),它们现在可以了吗?
  • 嗨@TejasK - 实际上,我并不是在暗示任何事情,在这种情况下也无法做出任何推论。我只是断言引用的 Apple 参考文献不再包含在最新的 Apple HIG 中。
【解决方案2】:

当您致电exit(0) 时,您会立即终止您的应用程序。 0 是状态码,表示成功终止。

没有调用其他方法,您的应用程序就死了。结果,最终用户可能会认为应用程序只是崩溃了。

Apple 不鼓励你在任何地方调用 exit。

【讨论】:

  • 如何以推荐的方式退出我的应用程序,但以编程方式?
  • @george:你不知道。用户必须主动选择关闭应用程序。
  • 当我调用 exit(0) 时(仅测试,我知道这是不允许/不推荐的),应用程序仍然显示在后台应用程序列表中。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    没有 Apple 支持的方法来以编程方式终止您的应用程序。致电exit 肯定是不可能的。这会导致各种错误(例如多任务切换器会严重损坏)以及错误。

    如果您尝试禁用多任务处理,您可以使用 Info.plist 文件中的 UIApplicationExitsOnSuspend 键来执行此操作(键的标题是“应用程序不在后台运行”)。

    除此之外,您的用户可以按主页按钮关闭您的应用程序。

    【讨论】:

    • 有调用exit(0)的有效用例。应用程序运行时的一部分可能会崩溃(例如,在使用 Mono 的应用程序中),Obj-C 代码可以采取的唯一安全措施是记录错误并立即终止。
    【解决方案5】:

    这些方法将被调用,但您不能使用 exit(0),您需要按后退按钮关闭您的应用,然后这些方法将被调用

    【讨论】:

    • 后退按钮关闭应用程序?这不是 Android。
    • 我的陈述是正确的,仅仅因为我称之为后退按钮并不能改变这一点。你不能使用 exit 0 并且关闭应用程序的唯一方法是使用物理按钮(无论你想怎么称呼它)
    • 嗯,你的说法不正确,因为那个按钮的名字是 home 按钮而不是返回按钮。
    猜你喜欢
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2010-11-08
    相关资源
    最近更新 更多