Estoy leyendo la documentación de Xcode y aquí hay algo que me desconcierta:
__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
[tmpSelf doSomething];
}];
Lo siguiente se copia de la documentación:
Un bloque forma una fuerte referencia a las variables que captura. Si lo usa
self
dentro de un bloque, el bloque forma una fuerte referencia al bloqueself
, por lo que siself
también tiene una fuerte referencia al bloque (lo que normalmente hace), se obtiene un fuerte ciclo de referencia. Para evitar el ciclo, debe crear una__block
referencia débil (o ) a sí mismo fuera del bloque, como en el ejemplo anterior.
No entiendo qué significa 'un débil (o __block
)'?
Es
__block typeof(self) tmpSelf = self;
y
__weak typeof(self) tmpSelf = self;
exactamente lo mismo aquí?
Encontré otra pieza en el documento:
Nota: En un entorno de recolección de basura, si aplica modificadores
__weak
y__block
a una variable, el bloque no garantizará que se mantenga viva.
Entonces, estoy totalmente desconcertado.
__block _weak NSString *strEg;
?documentos de Apple
fuente
Además de otras respuestas en
__block
vs__weak
, hay otra forma de evitar el ciclo de retención en su escenario.@weakify(self); [self methodThatTakesABlock:^ { @strongify(self); [self doSomething]; }];
Más información sobre @Weakify @Strongify Macro
fuente
Cuando use self en block, debe usar __weak , no __block ya que puede retener self.
En caso de que necesite un yo fuerte, puede usarlo así:
__weak typeof(self) *weakSelf = self; [self methodThatTakesABlock:^{ if (weakSelf) { __strong typeof(self) *strongSelf = weakSelf; [strongSelf doSomething]; } }];
fuente