Ho un metodo che si blocca di tanto in tanto.È "autonomo" debole all'interno di un metodo in ARC?
-(void)foo{
[self doSomething];
[self.delegate didFinish];
[self doSomethingElse];
}
-doSomething funziona correttamente, quindi chiamo un delegato -didFinish. All'interno di -didFinish, il riferimento a questo oggetto potrebbe essere impostato su zero, rilasciandolo sotto ARC. Quando il metodo si arresta, lo fa su -doSomethingElse. La mia ipotesi era che il sé sarebbe stato forte all'interno di un metodo, permettendo alla funzione di completarsi. È debole o forte? C'è documentazione su questo? Quale sarebbe il ragionamento per essere forte o debole?
Modifica
Dopo essere stato ispirato da alcune delle risposte di seguito, ho fatto qualche indagine. La causa effettiva del crash nel mio caso era che NSNotificationCenter non conservasse l'osservatore in ogni caso. Mike Weller indica che i chiamanti dei metodi devono conservare l'oggetto mentre viene chiamato per evitare il caso che ho descritto sopra, tuttavia sembra che NSNotificationCenter ignori questo problema e mantenga sempre un debole riferimento all'osservatore. In altre parole:
-(void)setupNotification{
//observer is weakly referenced when added to NSNotificationCenter
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleNotification:)
name:SomeNotification object:nil];
}
//handle the notification
-(void)handleNotification:(id)notification{
//owner has reference so this is fine
[self doSomething];
//call back to the owner/delegate, owner sets reference to nil
[self.delegate didFinish];
//object has been dealloc'ed, crash
[self doSomethingElse];
}
Se è '' weak' quindi self' dovrebbe diventare 'quelle negative, e l'invio di un messaggio a' quelle negative non vada in crash. Quindi indovinerei, neanche. – kennytm
Hai usato 'NSLog' per vedere cosa succede con' self.delegate'? – Desdenova
Dovresti pubblicare un po 'più di codice e la traccia dello stack, anche se si verificano eccezioni o errori. Come viene dichiarato il delegato? –