Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

call exit(0) in iphone app

At some point in my application I have done this exit(0) which crashes my app. But I haven't figured out what method gets called when this executes.

I've put messages in:

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

But none of this seem to get called! Any idea about what method is called when exit(0) is done?

like image 262
adrian Avatar asked Dec 13 '11 15:12

adrian


3 Answers

From Apple's Human User Guidelines...

Don’t Quit Programmatically

Never quit an iOS application programmatically because people tend to interpret this as a crash. However, if external circumstances prevent your application from functioning as intended, you need to tell your users about the situation and explain what they can do about it. Depending on how severe the application malfunction is, you have two choices.

Display an attractive screen that describes the problem and suggests a correction. A screen provides feedback that reassures users that there’s nothing wrong with your application. It puts users in control, letting them decide whether they want to take corrective action and continue using your application or press the Home button and open a different application

If only some of your application's features are not working, display either a screen or an alert when people activate the feature. Display the alert only when people try to access the feature that isn’t functioning.

If you've decided that you are going to quit programmatically anyway...

In C, exit(0) will halt execution of the application. This means that no delegate methods or exception handlers will be called. So, if the goal is to make sure that some code gets called when the closes, even on a forced close, there may be another option. In your AppDelegate implement a custom method called something like -(void)applicaitonIsgoingAway. Call this method from within anywhere you want your exiting code to be called:

  1. applicationWillTerminate
  2. applicationDidEnterBackground
  3. onUncaughtException

The first two are ones that you already mentioned in your question. The third can be a catch-all of sorts. It's a global exception handler. This next bit comes from a question on that very topic.

This exception handler will get called for any unhanded exceptions (which would otherwise crash your app). From within this handler, you can call applicaitonIsgoingAway, just like in the other 2 cases. From the other question that I mentioned above, you can find an answer similar to this.

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

But in order for this to work, you need to set this method up as the exception handler like so...

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

Now, you can quit the app programmatically by calling NSAssert(FALSE, @"Quitting the app programmatically."); As long as there is no other exception handler in place to catch this, your app will begin to crash, and your exception handler code will be called. in-turn calling applicationIsGoingAway.

like image 160
Jeff Wolski Avatar answered Oct 17 '22 07:10

Jeff Wolski


When you call exit(0) you immediately terminate your application. 0 is a status code which means successful termination.

No other method is called, you application just dies. As a result end user may think app is just crashed.

Apple discourages you to call exit anywhere.

like image 24
Dimme Avatar answered Oct 17 '22 05:10

Dimme


exit(0) is a C function that terminates your app's process therefore none of the application delegates methods will be called, the app will be killed immediately. Apple recommends strongly against your app quitting because it appears broken to the user.

like image 23
Matthew Bischoff Avatar answered Oct 17 '22 05:10

Matthew Bischoff