2012-11-28 15 views
8

Próbuję wykryć awarię spowodowaną przez prywatną metodę w UIAlertView. Około połowa moich awarii aplikacji dotyczy tego.Dziwna prywatna metoda UIAlertView crash _performPopup

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

Oto sekcja z mojego raportu o awarii. Martwi mnie to, że większość moich alertów jest tworzona przez pojedyncze obiekty zaprojektowane tak, aby istniały przez cały cykl życia aplikacji. Nie jestem więc pewien, czy jest to spowodowane tym, że delegat UIAlertView został zwolniony, zanim zostanie wywołany przez niego. Czy ktoś to widział wcześniej? Proszę, czy możesz mi doradzić? Dzięki.

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 
+0

Czy u udostępnić kod do tworzenia alertview –

+1

patrz post: http: // stackoverflow.com/questions/2581081/uialertview-crashing-on-undocumented-method – petert

Odpowiedz

3

Wygląda na to, że przyczyną problemu jest delegat. W przypadku prostych UIAlertViews które nie potrzebują do śledzenia wprowadzanych przez użytkownika, można po prostu ustawić delegata do zera, takie jak:

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

Jeśli potrzebują metod delegata, po prostu upewnij się, że nil delegować UIAlertView kiedy utrata widoku:

alert.delegate = nil; 

Albo w dealloc lub ewentualnie viewWillDisappear: w zależności od konfiguracji twojego kodu!

0

Dobrym pomysłem jest również odrzucenie i usunięcie widoku alertu, gdy aplikacja przechodzi w tło.

Dodaj następujące metody viewDidLoad:

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

Realizacja handleApplicationDidEnterBackground następnie powinien wyglądać następująco:

- (void)handleApplicationDidEnterBackground:(NSNotification *)n 
{ 
    if (self.alertView) 
    { 
     self.alertView.delegate = nil; 
     [self.alertView dismissWithClickedButtonIndex:[self.alertView cancelButtonIndex] animated:NO]; 
     self.alertView = nil; 
    } 
} 
Powiązane problemy