Lavorare su un progetto iOS che ha come target 4.0 e 5.0, utilizzando ARC.ARC, Blocks and Retain Cycles
Esecuzione in un problema relativo ai blocchi, ARC e riferimento a un oggetto dall'esterno del blocco. Ecco po 'di codice:
__block AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlock:^ {
if ([operation isCancelled]) {
return;
}
... do stuff ...
operation = nil;
}];
In questo caso, il compilatore dà un avvertimento che l'utilizzo di 'funzionamento' nel blocco sta per portare ad un ciclo di trattenere. Sotto ARC, __block ora mantiene la variabile.
Se aggiungo __unsafe_unretained, il compilatore rilascia immediatamente l'oggetto, quindi ovviamente non funzionerà.
Ho scelto come target 4.0, quindi non riesco a utilizzare __weak.
Ho provato a fare qualcosa di simile:
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
__block __unsafe_unretained AFHTTPRequestOperation *weakOperation = operation;
ma mentre weakOperation non è pari a zero, nessuna delle sue proprietà sono popolate quando all'interno del blocco.
Qual è il modo migliore per gestire questa situazione dati i vincoli di progetto elencati sopra?
Ho la cosa del "ciclo di conservazione" martellata nella mia mente, non ci ho nemmeno pensato come hai descritto. Duh. Domanda successiva: un modo per disattivare l'avviso del compilatore? Mi farà impazzire. – Hunter
Vedere ["Controlling Diagnostics via Pragmas"] (http://clang.llvm.org/docs/UsersManual.html#diagnostics_pragmas) nel manuale dell'utente di Clang. Dovrai solo capire quale flag di avviso ignorare. –
È '#pragma clang diagnostic ignored" -Warc-retain-cycles "', di by. –