2013-09-25 12 views
29

Mam następujący ślad stosu, podczas gdy moja aplikacja ulega awarii po dotknięciu "OK" na UIAlertView. Czy to moja wina, czy błąd iOS7? Nie wiem, jak to naprawić.Błąd iOS 7 lub mój błąd w 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 kod widok

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

a ja nie zdefiniowano metodę delegata.

+1

Czy możesz pokazać kod, którego używasz do wyświetlania widoku alertu, a także metodę delegowaną, którą napisałeś. Dzięki. – Fogmeister

+0

Jak powiedział @Fogmeister, czy możesz podać swój kod alarmowy i jego kod delegata? Dzięki! – matteodv

Odpowiedz

17

Głupi mi, po prostu trzeba ustawić delegata alert widoku danych, by nil

+1

Dokładnie, właśnie napisałem komentarz na ten temat! :) – matteodv

+0

@matteodv dzięki! –

+0

Nie ma za co! – matteodv

13

Ponieważ delegat UIAlertView jest własnością przypisać w UIAlertView. Myślę, że to wina Apple'a. Powinien być słabym wskaźnikiem w ARC. Ale jest to właściwość assign, więc przed zniszczeniem delegata musisz ustawić dowolnego delegata widoku alertu na nil (przez większość czasu klasa kontrolera jest wyskakiwana lub nawigowana z powrotem). Przeczytaj plik .h dla UIAlertView o delegacie, możesz go znaleźć jako właściwość assign, a ktoś skomentował po deklaracji "słabe referencje".

+0

Dokładnie to się stało: Delegat został zniszczony zaraz po został wyświetlony widok alertu. –

+3

Mam ten sam problem, ale działo się to tylko my tworzymy ipa i uruchamiamy. Nie w symulatorze ani debugowaniu Dlaczego? dowolny pomysł? – Johnykutty

5

Najlepszym sposobem na uniknięcie problemu z UIAlertView podczas korzystania z delegacji jest utworzenie instancji UIAlertView jako iVar dla klasy delegatów. I po należy dokonać nieruchomości delegat alertView jako zero w dealloc klasy delegata

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

To samo podejście jest wystarczająco dobry dla wszystkich starych klas z przypisać typu delegatów.

0

Jeśli chcesz określić delegata, działa również "autorelease" w widoku alertu.

Powiązane problemy