2011-06-27 24 views
6

Mam dziwne zachowanie z obiektu NSNotification.
Moja aplikacja ma kontroler nawigacyjny, pierwszy widok to widok tabeli, a drugi widok to tylko kontroler widoku, który pokazuje dane wybranej komórki.
W tym kontrolerze widoku danych wysyłam powiadomienie po naciśnięciu przycisku. Powiadomienie również działa na początku.NSNotification prowadzi do błędu segmentacji

ALE kiedy wracam do widoku tabeli i ponownie wciskam kontrolkę widoku danych na stos i dotykając przycisku z powiadomieniem, cała aplikacja ulega awarii bez protokołu błędów.
Xcode podkreśla tylko ten wiersz:

[[NSNotificationCenter defaultCenter] 
postNotificationName:@"toggleNoteView" object:nil]; 

Funkcja gdzie mogę wysłać zgłoszenia:

- (IBAction) toggleNoteView: (id) sender 
{ 
    [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"toggleNoteView" object:nil]; 
} 

Jest to odbiornik:

- (id)init { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(toggleNoteView:) 
              name:@"toggleNoteView" object:nil]; 
    ... 
} 

- (void) toggleNoteView:(NSNotification *)notif { 

    takingNotes = !takingNotes; 
} 

Edit: Teraz ja dostawałem jakiś błąd logi.

2011-06-27 23:05:05.957 L3T[3228:707] -[UINavigationItemView toggleNoteView:]: unrecognized selector sent to instance 0x4b235f0 
2011-06-27 23:05:06.075 L3T[3228:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationItemView toggleNoteView:]: unrecognized selector sent to instance 0x4b235f0' 
*** Call stack at first throw: 
(
0 CoreFoundation      0x3634f64f __exceptionPreprocess + 114 
1 libobjc.A.dylib      0x370a2c5d objc_exception_throw + 24 
2 CoreFoundation      0x363531bf -[NSObject(NSObject) doesNotRecognizeSelector:] + 102 
3 CoreFoundation      0x36352649 ___forwarding___ + 508 
4 CoreFoundation      0x362c9180 _CF_forwarding_prep_0 + 48 
5 Foundation       0x35c45183 _nsnote_callback + 142 
6 CoreFoundation      0x3631e20f __CFXNotificationPost_old + 402 
7 CoreFoundation      0x362b8eeb _CFXNotificationPostNotification + 118 
8 Foundation       0x35c425d3 -[NSNotificationCenter postNotificationName:object:userInfo:] + 70 
9 Foundation       0x35c441c1 -[NSNotificationCenter postNotificationName:object:] + 24 
10 L3T         0x0003d17f -[Container toggleNoteView:] + 338 
11 CoreFoundation      0x362bf571 -[NSObject(NSObject) performSelector:withObject:withObject:] + 24 

Odpowiedz

8

Nie zapomnij usunąć obserwatora podczas rozładunku widok. Zasadniczo dzieje się tak, że po wysłaniu powiadomienia do nieistniejącego widoku nie można uruchomić selektora, powodując awarię aplikacji.

3

Wygląda na to, że za każdym razem, gdy naciskasz kontroler widoku, tworzysz nowe wystąpienie kontrolera widoku, aby to zrobić.

Jeśli tak jest, należy najpierw upewnić się, że nie przeniknął ten kontroler widoku po powrocie do widoku tabeli.

Następnie, w metodzie dealloc tego obiektu, zrezygnuj z otrzymywania powiadomień.

-(void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    //other deallocation code 
    [super dealloc]; 
} 
Powiązane problemy