Сбой при закрытом методе UIAlertView - PullRequest
3 голосов
/ 23 марта 2012

Я вижу странное падение в одном из моих приложений, которое, похоже, происходит из-за закрытого метода в UIAlertView. Я просмотрел некоторые поиски и нашел несколько других ссылок на этот метод, связанных с сбоями, таких как здесь , но я не уверен, что причина та же. Однако, чтобы быть уверенным, убедитесь, что я всегда устанавливаю делегат UIAlertView равным nil всякий раз, когда делегат освобождается.

Трассировка стека выглядит следующим образом:

Exception Type:  SIGABRT
Exception Codes: #0 at 0x351ce32c
Crashed Thread:  0

Thread 0 Crashed:
0   libsystem_kernel.dylib              0x351ce32c __pthread_kill + 8
1   libsystem_c.dylib                   0x370c329f abort + 95
2   eLogbook                            0x000bbacd -[GetOperationPartsDictionary init] (GetOperationPartsDictionary.m:22)
3   UIKit                               0x32557f93 -[UIAlertView(Private) _popoutAnimationDidStop:finished:] + 855
4   UIKit                               0x3240dc53 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 471
5   UIKit                               0x3241357d -[UIViewAnimationState animationDidStop:finished:] + 53
6   QuartzCore                          0x36eeac2f CA::Layer::run_animation_callbacks(void*) + 203
7   libdispatch.dylib                   0x3140ae91 _dispatch_main_queue_callback_4CF$VARIANT$up + 197
8   CoreFoundation                      0x353ad2ad __CFRunLoopRun + 1269
9   CoreFoundation                      0x353304a5 CFRunLoopRunSpecific + 301
10  CoreFoundation                      0x3533036d CFRunLoopRunInMode + 105
11  GraphicsServices                    0x3662c439 GSEventRunModal + 137
12  UIKit                               0x32426e7d UIApplicationMain + 1081
13  eLogbook                            0x0007767f main (main.m:14)

Что меня действительно смущает, так это то, что -[UIAlertView(Private) _popoutAnimationDidStop:finished:] метод вызывает метод init для моего класса GetOperationPartsDictionary. Из-за ограниченного количества информации, которую я получил от пользователей, этот сбой происходит при запуске, и в этот момент этот класс не был бы загружен.

Я использую QuincyKit для доставки отчетов о сбоях на сервер, оттуда они обозначаются стандартным скриптом symbolicatecrash. Версия Xcode, используемая для обозначения сбоя, является той же версией, которая использовалась для построения двоичного файла, и я уверен, что dSYM, используемый для обозначения сбоя, является верным - например, номера строк для моего кода верны .

У кого-нибудь есть мысли по этому поводу?

Редактировать: следовало добавить, что это происходит в поле с живым приложением, но только изредка. Возможно, это затронуло 1 или 2 пользователя из тысячи или около того, но я никогда не мог воспроизвести его ни на устройстве, ни в симуляторе.

1 Ответ

0 голосов
/ 12 марта 2013

Похоже, что вы вызвали UIAlertViewDelegate после того, как представление оповещения было выпущено.

Отпустите его только в методе dealloc, например:

-(void)dealloc {
    self.alertView.delegate = nil; //setting delegate to nil
    self.alertView = nil; //if you have defined alert as property
    //other release statements of your controller
    [super dealloc];
}
...