2013-09-25 9 views
29

Ho la seguente traccia dello stack mentre la mia app si blocca toccando "OK" su un UIAlertView. È colpa mia o di un bug iOS7? Non so come risolvere questo problema.iOS 7 bug o il mio bug in UIAlertView

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 

Alert codice vista

UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error" 
    message:[NSString stringWithFormat:@"Es ist ein Fehler aufgetreten: %@", [error localizedDescription]] 
    delegate:self 
    cancelButtonTitle:@"OK" 
    otherButtonTitles:nil]; 
[av show]; 

e non ho definito un metodo delegato.

+1

Puoi mostrare il codice che usi per visualizzare la vista di avviso e anche il metodo di delega che hai scritto. Grazie. – Fogmeister

+0

Come ha detto @Fogmeister, puoi fornire il tuo codice di avviso e il suo codice delegato? Grazie! – matteodv

risposta

17

me stupido, non mi resta che impostare il delegato del visualizzazione degli avvisi a zero

+1

Esattamente, stavo giusto scrivendo un commento a riguardo! :) – matteodv

+0

@matteodv grazie! –

+0

Prego! – matteodv

13

Perché il delegato del UIAlertView è una proprietà assegnare in UIAlertView. Penso che sia colpa di Apple. Dovrebbe essere un puntatore debole in ARC. Ma è una proprietà di assegnazione, quindi è necessario impostare il delegato della vista di avviso su nil prima di distruggere il delegato (la maggior parte delle volte che una classe di controller è stata scoccata o spostata indietro). Leggi il file .h per il numero UIAlertView sul delegato, puoi trovare che è una proprietà assign e qualcuno ha commentato dopo la dichiarazione "// riferimento debole".

+0

Questo è esattamente ciò che è successo: il delegato è stato distrutto subito dopo è stata mostrata la vista di avviso. –

+3

Ho avuto lo stesso problema, ma stava succedendo solo noi creiamo un ipa e lo eseguiamo. Non nel simulatore o nel debug Perché? qualche idea? – Johnykutty

5

Il modo migliore per evitare problemi con UIAlertView durante l'utilizzo della delega è a rendere l'istanza di UIAlertView come iVar per la classe delegato. E dopo si dovrebbe fare di proprietà delegato del alertView come nullo in dealloc della classe Delegate

@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]; 
} 

Lo stesso approccio è abbastanza buono per tutte le vecchie classi con assegnazione di tipo delegati.

0

Se è necessario specificare un delegato, anche l'esecuzione di una 'autorelease' nella vista di avviso funzionerà.

Problemi correlati