2010-12-03 18 views
2

Matt Gallagherのグローバル例外ハンドラを自分のプロジェクトに追加しようとしています。私は終了押す問題が発生したとアプリが終了していないiOS - UncaughtExceptionsグローバル例外ハンドラでアプリケーションを終了できない

http://cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html

:にある彼のサンプルプロジェクトを実行しています。それはアプリに私を返すだけです。私はkill()呼び出しでアプリケーションを終了しようとしましたが、終了することができません。

alertviewからのコールバックは、継続ケースを処理するように見えるだけで、強制的にアプリケーションを強制終了しません。

- (void)alertView:(UIAlertView *)anAlertView clickedButtonAtIndex:(NSInteger)anIndex 
{ 
    if (anIndex == 0) 
    { 
     dismissed = YES; 
    } 
} 

私がアプリケーションを知って、その性質によって、自分自身を終了することはできませんが、アプリがクラッシュした場合、この場合には、私は[終了]ボタンを押して、ユーザーが好きとアプリが終了しなければならないと思います。

ありがとうございます!

答えて

5

Appleは終了ボタンを信じていません。しかし、あなたはあなたのアプリがクラッシュするのを捕まえない別の例外を投げることができますが、アプリがクラッシュすると承認されません。

あなたのinfo.plistでUIApplicationExitsOnSuspendをtrueに設定し、ホームボタンを押すだけでアプリケーションを終了させることができます。その場合、他のアプリへのリンクを終了ボタンにすることができます。

例外を常に発生させるifステートメントを変更すると、アプリケーションがクラッシュして終了するようにする必要があります。

- (void)handleException:(NSException *)exception 
{ 
    [self validateAndSaveCriticalApplicationData]; 

    UIAlertView *alert = 
     [[[UIAlertView alloc] 
      initWithTitle:NSLocalizedString(@"Unhandled exception", nil) 
      message:[NSString stringWithFormat:NSLocalizedString(
       @"You can try to continue but the application may be unstable.\n\n" 
       @"Debug details follow:\n%@\n%@", nil), 
       [exception reason], 
       [[exception userInfo] objectForKey:UncaughtExceptionHandlerAddressesKey]] 
      delegate:self 
      cancelButtonTitle:NSLocalizedString(@"Quit", nil) 
      otherButtonTitles:NSLocalizedString(@"Continue", nil), nil] 
     autorelease]; 
    [alert show]; 

    CFRunLoopRef runLoop = CFRunLoopGetCurrent(); 
    CFArrayRef allModes = CFRunLoopCopyAllModes(runLoop); 

    while (!dismissed) 
    { 
     for (NSString *mode in (NSArray *)allModes) 
     { 
      CFRunLoopRunInMode((CFStringRef)mode, 0.001, false); 
     } 
    } 

    CFRelease(allModes); 

    NSSetUncaughtExceptionHandler(NULL); 
    signal(SIGABRT, SIG_DFL); 
    signal(SIGILL, SIG_DFL); 
    signal(SIGSEGV, SIG_DFL); 
    signal(SIGFPE, SIG_DFL); 
    signal(SIGBUS, SIG_DFL); 
    signal(SIGPIPE, SIG_DFL); 

    [exception raise]; 
} 
+1

アプリを強制的にシャットダウンする必要がある場合は、 'abort()'を呼び出すことができます。 –

+0

こんにちは、@Tom、例外を処理するために上記のコードを取り上げましたが、アラートは表示されましたが、どのUIイベントにも応答せず、一度も解消しませんでした。何か案が? – fifth

関連する問題