Sono ancora nuovo per i blocchi in ogg-c e mi chiedo se ho questo codice psuedo corretto. Non sono sicuro se è abbastanza per rimuovere solo l'osservatore o se devo chiamare removeObserver: Nome: oggetto:Gestione corretta di addObserverForName: object: queue: usingBlock:
-(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: Sto ricevendo intermittente EXC_BAD_ACCESS
da questo blocco, in modo da questo non può essere destra.
È necessario '__block id scanComplete;', o verrà copiato nel blocco e si verificheranno gli osservatori. – hwaxxer
Nel mondo di ARC, il commento sull'uso di '__block' per evitare l'acquisizione non è più valido. Ciò che _viene_ è vero, è che il qualificatore '__block' corregge un problema fondamentale: quando il blocco è definito,' addObserverForName: ...'non è ancora stato restituito, quindi il valore che viene catturato è' nil' nella migliore delle ipotesi (quando è in esecuzione in ARC, a causa del suo auto-nil implicito sulla dichiarazione delle variabili), o ** non definito **, scambiando un BAD_ACCESS per un comportamento completamente indefinito , nel peggiore dei casi ... – danyowdee
Rimozione dell'osservatore facendo riferimento a una variabile locale dall'interno del blocco era sempre scialbo. Memorizza il token dell'osservatore restituito (qui, 'scanComplete') come variabile di istanza; sotto ARC questa dovrebbe essere una variabile di istanza '__weak' per impedire un ciclo di mantenimento su se stesso. – matt