Ошибка iOS 7 или моя ошибка в UIAlertView
Я получил следующую трассировку стека, в то время как мое приложение падает при нажатии "ОК" на UIAlertView. Это моя вина или ошибка iOS7? Я не знаю, как это исправить.
OS Version: iOS 7.0 (11A465)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x00000000
Triggered by Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x39d50b36 objc_msgSend + 22
1 UIKit 0x3212e3da -[UIAlertView(Private) modalItem:shouldDismissForButtonAtIndex:] + 58
2 UIKit 0x31ed2036 -[_UIModalItemsCoordinator _notifyDelegateModalItem:tappedButtonAtIndex:] + 90
3 UIKit 0x31ed1f3e -[_UIModalItemAlertContentView tableView:didSelectRowAtIndexPath:] + 890
4 UIKit 0x31dd7326 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1074
5 UIKit 0x31e8a24e -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 210
6 UIKit 0x31d3a96e _applyBlockToCFArrayCopiedToStack + 314
7 UIKit 0x31cb246e _afterCACommitHandler + 426
8 CoreFoundation 0x2f5141d2 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 18
9 CoreFoundation 0x2f511b74 __CFRunLoopDoObservers + 280
10 CoreFoundation 0x2f511eb6 __CFRunLoopRun + 726
11 CoreFoundation 0x2f47cce2 CFRunLoopRunSpecific + 518
12 CoreFoundation 0x2f47cac6 CFRunLoopRunInMode + 102
13 GraphicsServices 0x3417727e GSEventRunModal + 134
14 UIKit 0x31d1ea3c UIApplicationMain + 1132
15 MyApp 0x000d8e5e 0xcb000 + 56926
16 libdyld.dylib 0x3a25dab4 start + 0
Код просмотра оповещений
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error"
message:[NSString stringWithFormat:@"Es ist ein Fehler aufgetreten: %@", [error localizedDescription]]
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[av show];
и я не определил метод делегата.
4 ответа
Глупо, мне просто нужно установить делегата для представления предупреждений на ноль
Потому что делегат UIAlertView
это свойство присваивания в UIAlertView
, Я думаю, что это вина Apple. Это должен быть слабый указатель в ARC. Но это свойство назначить, поэтому вам нужно установить делегат любого представления оповещения в nil
перед уничтожением делегата (большую часть времени класс контроллера был извлечен или перемещен обратно). Прочитайте.h файл для UIAlertView
Что касается делегата, вы можете обнаружить, что это свойство assign, и кто-то прокомментировал после объявления "// слабая ссылка".
Лучший способ избежать проблемы с UIAlertView при использовании делегирования - сделать экземпляр UIAlertView в качестве iVar для класса делегата. И после того, как вы должны сделать делегатное свойство alertView как nil в dealloc класса делегата
@implementation YOUR_CLASS
{
UIAlertView *_alert;
}
- (void)dealloc
{
_alert.delegate = nil;
}
- (void)showAlertView
{
_alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
Тот же подход достаточно хорош для всех старых классов с делегатами типа присвоения.
Если вам нужно указать делегата, то также будет выполнено "автоматическое освобождение" в представлении предупреждений.