Pregunta

Tengo una clase que contiene un bloque como un objeto propiedad:

@property (nonatomic, readwrite, copy) SFFailureBlock failureBlock;

donde sfffailureblock:

typedef void (^SFFailureBlock)(NSError *error);

Tengo una operación también declarada como propiedad de objetos (afhttpritestoperation) y quiero que llame al bloque de fallas una vez que se complete.

    [self.operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    __weak NSError *error = [NSError errorWithDomain:@"com.test" code:100 userInfo:@{@"description": @"zero results"}];
    failureBlock(error);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"nothing");
}];

Obtengo una advertencia de compilador "La captura" que sea firmemente en este bloque, es probable que conduzca a un ciclo de retención ".He buscado en Internet, pero no pude encontrar una solución decente en cuanto a por qué esto conduce a un ciclo de retención.No estoy llamando 'auto' dentro del bloque en ninguna parte.

Otra cosa extraña es que si escribo 'self.failureblock (error)' ¡El compilador no me da ninguna advertencia!

¿Alguien puede explicarme qué está pasando?Debo faltar seriamente algo en las reglas de administración de memoria de arco, pero no puedo entenderlo.

¿Fue útil?

Solución

Cuando se refiere a "ErrorBlock" en el bloque de la operación, realmente está haciendo "Auto-> cojemblock", por lo que se retiene implícitamente.Lo que puede hacer es crear una variable automática SFFFLOCKBLOCK XFAILUSEBLOCK= ULATBLOCK;Por encima de la autocoperación, luego úsalo en el bloque.[Nuevamente, quiere evitar cualquier otra referencia dentro de ese bloque.]

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top