Pergunta

Eu tenho uma classe que contém um bloco como propriedade do objeto:

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

onde SFFailureBlock:

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

Tenho uma operação também declarada como propriedade de objeto (AFHTTPRequestOperation) e quero que ela chame o bloco de falha assim que for concluído.

    [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");
}];

Recebo um aviso do compilador "Capturar 'self' fortemente neste bloco provavelmente levará a um ciclo de retenção".Pesquisei na Internet, mas não consegui encontrar uma solução decente para explicar por que isso leva a um ciclo de retenção.Não estou chamando 'self' dentro do bloco em lugar nenhum.

Outra coisa estranha é que se eu escrever 'self.failureBlock(error)' o compilador não me avisa!

Alguém pode me explicar o que está acontecendo?Devo estar faltando alguma coisa nas regras de gerenciamento de memória ARC, mas não consigo descobrir.

Foi útil?

Solução

Quando você se refere a "failureBlock" no bloco da operação, você está realmente fazendo "self-> failedBlock" - portanto, ele retém implicitamente o self.O que você pode fazer é criar uma variável automática SFFailureBlock xFailureBlock = failedBlock;acima da operação automática e use-a no bloco.[Novamente, você também deseja evitar quaisquer referências self-> DENTRO desse bloco.]

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top