Sto leggendo la documentazione di Xcode, e qui è una cosa che mi lascia perplesso:Qual è la differenza tra un riferimento __weak e __block?
__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
[tmpSelf doSomething];
}];
Di seguito è copiato dalla documentazione:
In un blocco forme un forte riferimento a variabili che cattura. Se si utilizza
self
all'interno di un blocco, il blocco costituisce un riferimento forte aself
, quindi seself
ha anche un forte riferimento al blocco (che in genere è ), si ottiene un ciclo di riferimento forte. Per evitare il ciclo, è necessario creare un riferimento debole (o__block
) al sé al di fuori del blocco, come nell'esempio sopra.
Non capisco cosa significa "debole (o __block
)"?
È
__block typeof(self) tmpSelf = self;
e
__weak typeof(self) tmpSelf = self;
esattamente lo stesso qui
ho trovato un altro pezzo nel documento:?
Nota: In un garbage collection ambiente, se si applica sia
__weak
e__block
modificatori di una variabile, quindi il blocco non garantisce che sia mantenuto in vita.
Quindi, sono totalmente perplesso.
Abbastanza chiaro, grazie. – HanXu
È ancora applicabile a iOS7 usando ARC? Ho eseguito un profiler e vedo che i miei controller vengono rilasciati anche se non utilizzo __block o __weak e riferimento self in un blocco. –
Per chi desidera vedere il documento: https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html, https://developer.apple.com/library/ios /documentation/Cocoa/Conceptual/Blocks/Articles/bxVariables.html –