2011-12-13 84 views
4

在我的应用程序中的某个时候,我已经完成了这个exit(0),这使我的应用程序崩溃。但是我没有想到当执行这个方法时会调用什么方法。在iPhone应用程序中调用退出(0)

我已经把消息在:

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

但这一切似乎被调用!任何关于在exit(0)完成时调用什么方法的想法?

+0

检查此问题:http://stackoverflow.com/questions/355168/proper-way-to-exit-iphone-application –

回答

2

exit(0)是一个C函数,终止您的应用程序的进程因此没有应用程序委托方法将被调用,该应用程序将立即被杀死。 Apple强烈建议您禁止您的应用程序,因为它对用户而言似乎已破坏。

6

当您致电exit(0)您立即终止您的申请。 0是一个意味着终止成功的状态码。

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

苹果不鼓励你打电话到任何地方退出。

+0

tehn如何以推荐方式离开我的应用程序,但编程? – adrian

+0

@george你可以抛出一个异常,或者,打开一个网页的URL ... –

+3

@george:你不知道。用户必须主动选择关闭应用程序。 – Dimme

-3

这些方法将被调用,但你不能用出口(0),就需要按后退按钮关闭你的应用程序,然后这些方法将被称为

+1

后退按钮关闭应用程序?这不是Android。 –

+0

我的声明是正确的,只是因为我称它为后退按钮并不会改变这一点。您不能使用退出0,关闭应用程序的唯一方法是使用物理按钮(无论您想调用它) –

+2

那么,您的声明是不正确的,因为该按钮的名称是* home *按钮而不是后面按钮。 –

0

有没有苹果的支持方法来终止应用程序编程。调用exit当然是不可能的。这会导致各种错误(例如,多任务切换器会崩溃)以及错误。

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

除此之外,用户需要按主页按钮关闭应用程序。

+1

有调用'exit(0)'的有效用例。应用程序运行时的一部分可能会崩溃(例如,在使用Mono的应用程序中),Obj-C代码剩下的唯一安全操作过程就是记录错误并立即死亡。 –

16

从苹果的人类用户指南...

不要退出编程

永不放弃iOS应用程序编程,因为人们往往 解释为崩溃。但是,如果外部环境阻止您的应用程序按预期运行,您需要告知用户有关情况并解释他们可以对此做些什么。 根据应用故障的严重程度,您有两个选择 。

显示一个有吸引力的屏幕,描述问题并提出 更正。屏幕提供的反馈可以让用户确信你的应用程序没有问题。它让用户控制, 让他们决定是否要采取纠正措施和 继续使用您的应用程序或按Home键,然后打开一个 不同的应用

如果仅仅是一些应用程序的功能无法正常运作,显示 当人们激活该功能时,屏幕或警报。只有当人们尝试访问不是 功能的功能时,才会显示 警报。

如果你决定,你会编程反正退出...

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

  1. applicationWillTerminate
  2. applicaitonDidEnterBackground
  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