Domanda

Ho una classe che tiene un blocco come proprietà dell'oggetto:

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

Dove SFFaiLureBlock:

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

Ho un'operazione anche dichiarata come proprietà oggetto (AFHTTPRequestorazione) e voglio chiamare il blocco di errore una volta completato.

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

Ottenere un avviso del compilatore "Catturare 'auto' fortemente in questo blocco è probabile che porti a un ciclo di conservazione".Ho cercato su Internet ma non ho trovato una soluzione decente sul perché questo porta a un ciclo di conservazione.Non sto chiamando 'auto' all'interno del blocco ovunque.

Un'altra cosa strana è che se scrivo 'self.failleureblock (errore)' il compilatore non mi dà alcun avviso!

qualcuno può spiegarmi cosa sta succedendo?Devo dire seriamente qualcosa nelle regole di gestione della memoria ARC, ma non riesco a capirlo.

È stato utile?

Soluzione

Quando si fa riferimento a "BURIFLOCK BLOCK" nel blocco dell'operazione, stai facendo davvero "self-> insuccesso" - quindi mantiene implicitamente il sé.Cosa puoi fare è creare una variabile automatica SFFaiLureBlock XFailureBlock= BURILLOCK;Sopra la solocerazione, quindi usarlo nel blocco.[Ancora una volta, si desidera evitare neanche referenze anche all'interno di quel blocco.]

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top