A avere un controller di visualizzazione e crea un oggetto "downloader", che ha un riferimento al controller di visualizzazione (come delegato). Il downloader richiama il controller della vista se scarica correttamente l'elemento. Funziona bene finché rimani sulla visuale, ma se ti allontani prima che il download sia completo ricevo EXC_BAD_ACCESS
. Capisco perché questo sta accadendo, ma c'è un modo per verificare se un oggetto è ancora assegnato? Ho provato a provare usando delegate != nil
e [delegate respondsToSelector:]
, ma soffoca.Evitare EXC_BAD_ACCESS quando si utilizza il pattern delegato
if (!self.delegate || ![self.delegate respondsToSelector:@selector(downloadComplete:)]) {
// delegate is gone, go away quietly
[self autorelease];
return;
}
else {
// delegate is still around
[self.delegate downloadComplete:result];
}
So che potrebbe,
a) sono gli oggetti downloader trattenere il controller della vista
b) mantenere un array di downloaders nel controller della vista, e impostare i valori delegato a zero quando Ho deallocato il controller di visualizzazione.
Ma mi chiedo se esiste un modo più semplice, in cui ho appena verificato se l'indirizzo del delegato contiene un oggetto valido?
Se si potesse verificare se un indirizzo contenesse un oggetto valido, per definizione, lo sarebbe, perché sarebbe valido accedervi per testare? –
ogg-c ha un sacco di astrazioni ... Posso immaginare un mondo in cui il runtime è stato in grado di distinguere tra un indirizzo con un oggetto valido e uno deallocato. –