8

UIAlertViewのプライベートメソッドによって引き起こされるクラッシュを理解しようとしています。私のアプリのクラッシュの約半分はこれに関係しています。

-[UIAlertView(Private) _performPopup:animationType:revealedBySpringBoardAlert:]

これが私のクラッシュレポートのセクションです。気になるのは、アラートビューのほとんどが、アプリのライフサイクル全体に存在するように設計されたシングルトンオブジェクトによってポップされることです。したがって、これがUIAlertViewのデリゲートが呼び出される前に解放されたことが原因であるかどうかはわかりません。誰かがこれを見たことがありますか?あなたがアドバイスしていただけますか?ありがとう。

Hardware Model:      iPhone4,1
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2012-11-15 11:31:57.452 -0800
OS Version:      iOS 6.0.1 (10A523)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x5354440a
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x33ab95b6 objc_msgSend + 22
1   UIKit                           0x32e52fa0 -[UIAlertView(Private) _performPopup:animationType:revealedBySpringBoardAlert:]
2   UIKit                           0x330621c4 -[UIAlertView(Private) _repopupNoAnimation]
3   UIKit                           0x33065b38 __36-[_UIAlertStackWatcher _appResumed:]_block_invoke_0
4   libdispatch.dylib               0x37ec211c _dispatch_call_block_and_release
5   libdispatch.dylib               0x37ec14b4 _dispatch_client_callout
6   libdispatch.dylib               0x37ec61b8 _dispatch_main_queue_callback_4CF$VARIANT$mp
7   CoreFoundation                  0x39ba2f36 __CFRunLoopRun
8   CoreFoundation                  0x39b15eb8 CFRunLoopRunSpecific
9   CoreFoundation                  0x39b15d44 CFRunLoopRunInMode
10  GraphicsServices                0x37ee32e6 GSEventRunModal
11  UIKit                           0x32d552f4 UIApplicationMain
12  MYAPP                           0x0000334a main + 70
13  MYAPP                           0x000032fc start + 36
4

2 に答える 2

3

ここでデリゲートが問題を引き起こしているようです。ユーザー入力を追跡する必要がない単純な UIAlertView の場合、次のようにデリゲートを nil に設定するだけです。

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"My Alert" message: @"My Message" delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];

デリゲート メソッドが必要な場合は、ビューを失うときに UIAlertView のデリゲートを nil にしてください。

alert.delegate = nil;

dealloc またはおそらく viewWillDisappear のいずれか: コードの設定方法に応じて!

于 2012-12-20T21:28:25.473 に答える
0

アプリがバックグラウンドになったときに、アラート ビューを閉じて無効にすることもお勧めします。

以下を viewDidLoad メソッドに追加します。

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleApplicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];

handleApplicationDidEnterBackground の実装は次のようになります。

- (void)handleApplicationDidEnterBackground:(NSNotification *)n
{
    if (self.alertView)
    {
        self.alertView.delegate = nil;
        [self.alertView dismissWithClickedButtonIndex:[self.alertView cancelButtonIndex] animated:NO];
        self.alertView = nil;
    }
}
于 2013-08-13T20:14:47.513 に答える