estoy leyendo la documentación de Xcode, y aquí es algo que me intriga:¿Cuál es la diferencia entre una referencia __weak y __block?
__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
[tmpSelf doSomething];
}];
El siguiente es copiado de la documentación:
Se forma un bloque de una fuerte referencia a las variables que captura. Si utiliza
self
dentro de un bloque, el bloque constituye una referencia fuerte alself
, por lo que siself
también hace una referencia fuerte al bloque (que típicamente es ), se obtiene un fuerte ciclo de referencia. Para evitar el ciclo, necesita para crear una referencia débil (o__block
) a sí mismo fuera del bloque, como en el ejemplo anterior.
No entiendo qué significa 'a weak (or __block
)'?
Es
__block typeof(self) tmpSelf = self;
y
__weak typeof(self) tmpSelf = self;
exactamente lo mismo aquí
me encontré con otra pieza en el documento:?
Nota: En una recogida de basura entorno, si aplica ambosModificadores dey
__block
a una variable, entonces el bloque no asegurará que se mantenga activo.
Por lo tanto, estoy totalmente perplejo.
Muy claro, gracias. – HanXu
¿Sigue siendo aplicable a iOS7 con ARC? Ejecuté un generador de perfiles y veo que mis controladores están siendo liberados incluso si no uso __block o __weak y me refiero a uno mismo en un bloque. –
Para alguien que quiera ver el 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 –