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
selfdentro de un bloque, el bloque forma una fuerte referencia al bloqueself, por lo que siselftambié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__blockreferencia 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
__weaky__blocka 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
__blockvs__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