exit(0)
操作,导致我的应用程序崩溃。但我还没有找出这个操作执行时调用了哪个方法。我已经添加了一些消息:
(void)applicationWillTerminate:(UIApplication *)application
(void)applicationDidEnterBackground:(UIApplication *)application
但是似乎没有任何一个方法被调用!你知道当执行exit(0)
时会调用哪个方法吗?
exit(0)
操作,导致我的应用程序崩溃。但我还没有找出这个操作执行时调用了哪个方法。(void)applicationWillTerminate:(UIApplication *)application
(void)applicationDidEnterBackground:(UIApplication *)application
但是似乎没有任何一个方法被调用!你知道当执行exit(0)
时会调用哪个方法吗?
根据 Apple 的人类用户指南...
不要程序化地退出
永远不要通过编程方式退出 iOS 应用程序,因为人们往往会把它解释为应用程序崩溃。然而,如果外部情况阻止您的应用程序按预期运行,您需要告知用户有关该情况并解释他们可以采取什么措施。根据应用程序故障的严重程度,您有两个选择。
显示一个吸引人的屏幕来描述问题并建议纠正方法。屏幕提供反馈,让用户放心地知道您的应用程序没有问题。它让用户掌握了控制权,让他们决定是否要采取纠正措施并继续使用您的应用程序,或者按下 Home 按钮打开另一个应用程序。
如果只有某些应用程序功能不起作用,请在人们激活该功能时显示屏幕或警报。只有当人们尝试访问未能运行的功能时才显示警报。
在 C 中,exit(0)
将停止应用程序的执行。这意味着不会调用任何委托方法或异常处理程序。因此,如果目标是确保在关闭应用程序时调用某些代码,即使在强制关闭时也是如此,可能会有另一种选择。在您的 AppDelegate
中实现一个名为 -(void)applicaitonIsgoingAway
的自定义方法。从任何您想要调用退出代码的地方调用此方法:
applicationWillTerminate
applicationDidEnterBackground
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
。
当你调用 exit(0)
时,你会立即终止你的应用程序。0 是一个状态码,表示成功终止。
没有其他方法被调用,你的应用程序就直接结束了。因此,最终用户可能会认为应用程序崩溃了。
苹果公司不建议在任何地方调用 exit。
exit(0)
是一个C函数,它终止应用程序的进程,因此不会调用任何应用程序代理方法,应用程序将立即被终止。苹果强烈建议您的应用程序不要退出,因为这会给用户留下应用程序出现故障的印象。
没有苹果支持的方法可以通过编程方式终止您的应用程序。调用exit
肯定是不可行的。这会导致各种各样的错误(例如多任务切换器将严重破坏),并且根本是错误的。
如果您想禁用多任务处理,可以在Info.plist文件中使用UIApplicationExitsOnSuspend
键来实现(该键的标题为“应用程序不在后台运行”)。
除此之外,让您的用户按下主屏幕按钮来关闭您的应用程序。
exit(0)
有其合理的使用场景。应用程序的一部分运行时可能会崩溃(例如,在使用 Mono 的应用程序中),Obj-C 代码所能采取的唯一安全措施是记录错误并立即退出。 - Slipp D. Thompson