Korrektes management der addObserverForName:object:queue:usingBlock:
Ich bin noch neu in Blöcke in objective-c und Fragen, wenn ich diese Pseudo-code zu korrigieren. Ich bin mir nicht sicher, ob es genug ist, entfernen Sie einfach den Beobachter zu oder wenn ich zu rufen, removeObserver:name:Objekt:
-(void) scan {
Scanner *scanner = [[Scanner alloc] init];
id scanComplete = [[NSNotificationCenter defaultCenter] addObserverForName:@"ScanComplete"
object:scanner
queue:nil
usingBlock:^(NSNotification *notification){
/*
do something
*/
[[NSNotificationCenter defaultCenter] removeObserver:scanComplete];
[scanner release];
}];
[scanner startScan];
}
Update: ich erhalte intermittierende EXC_BAD_ACCESS
aus diesem block, so kann dies nicht richtig sein.
InformationsquelleAutor der Frage seanalltogether | 2010-12-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erklären die
scanComplete
variable definieren, bevor der block selbst.Der Grund, warum Sie brauchen, um dies zu tun ist, weil Sie versuchen, Zugriff auf eine variable, die nicht existiert, die innerhalb der block zum Zeitpunkt der definition, da die variable selbst wurde noch nicht zugeordnet noch.
Was ist
EXC_BAD_ACCESS
? Nun, es ist eine Ausnahme, die geworfen wird, wenn Sie versuchen, Zugriff auf einen Verweis, der nicht existiert. So, dass ist genau das der Fall in deinem Beispiel.Also, wenn Sie die variable deklariert haben, bevor der block selbst, dann sollte es funktionieren:
InformationsquelleAutor der Antwort Jacob Relkin
Sollten Sie keine Registrierung in dem register-block. Stattdessen speichern Sie das zurückgegebene token aus
addObserverForName
(in diesem Fall, IhrescanComplete
) als eine Instanz-variable oder in eine Sammlung, ist eine Instanz-variable, und melde dich später, wenn Sie über zu gehen, aus dem Dasein (z.B. indealloc
). Was ich tun ist, halten ein NSMutableSet genanntobservers
. Also:Später dann:
InformationsquelleAutor der Antwort matt
Apple-Dokument zu dieser Methode:
Das folgende Beispiel zeigt, wie Sie sich registrieren können, erhalten Gebietsschema ändern-Benachrichtigungen.
Aufheben Beobachtungen, übergeben Sie das zurückgegebene Objekt von dieser Methode removeObserver:. Sie muss aufrufen, removeObserver: oder removeObserver:name:Objekt: vor jedem Objekt angegeben addObserverForName:object:queue:usingBlock: freigegeben ist.
InformationsquelleAutor der Antwort likid1412
Den Umfang des Blocks nicht über die Berechtigung zum release der scanner-Objekt. Wenn Sie nicht mit garbage collection, das entfernen der
release
und machen den scanner autorelease ([[[Scanner alloc] init] autorelease]
) sollte den trick tun.Sollten Sie auch in der Lage sein, um sicher zu bewegen, den Aufruf
removeObserver
außerhalb des Blocks.Für den Fall der
EXC_BAD_ACCESS
: Eingabebt
in der Konsole-Fenster, nachdem Sie die Anwendung stürzt ab, wird Ihnen ein backtrace, und sollte Sie darüber informieren, wo der Fehler aufgetreten ist.InformationsquelleAutor der Antwort mralex