Ho difficoltà a convertire alcuni codici NSOperation in ARC. L'oggetto operazione utilizza un blocco di completamento, che a sua volta contiene un blocco GCD che aggiorna l'interfaccia utente sul thread principale. Poiché faccio riferimento al mio oggetto operazione dall'interno del suo blocco di completamento, sto utilizzando un puntatore __weak per evitare perdite di memoria. Tuttavia, il puntatore è già impostato su zero al momento dell'esecuzione del codice.Riferimento a un oggetto NSOperation nel proprio blocco di completamento con ARC
L'ho ristretto a questo esempio di codice. Qualcuno sa dove ho sbagliato e il modo giusto per farlo?
NSOperationSubclass *operation = [[NSOperationSubclass alloc] init];
__weak NSOperationSubclass *weakOperation = operation;
[operation setCompletionBlock:^{
dispatch_async(dispatch_get_main_queue(), ^{
// fails the check
NSAssert(weakOperation != nil, @"pointer is nil");
...
});
}];
Bene, ciò che è andato storto è che un puntatore debole non è proprietario. Se non c'è nient'altro che tiene la variabile (e non c'è), verrà eliminata. Sei sicuro di avere una perdita se usi 'operazione'? Sembra che dovrebbe sparire quando viene rilasciato il blocco di completamento, che dovrebbe essere appena chiamato. (Potrebbe essere ingenuo, però.) –
ARC si stava lamentando al momento della compilazione. Senza di esso stavo usando direttamente il puntatore dell'operazione (e non credo che stavo perdendo memoria). –
Buona fortuna con questo. Penso di aver lottato contro di esso per diverse ore prima di arrendermi e fare qualcos'altro. Ma è passato un po 'di tempo. :) –