Trabajando en un proyecto iOS que apunta a 4.0 y 5.0, usando ARC.Ciclo de ARC, Bloques y retención
Al encontrarse con un problema relacionado con bloques, ARC y hacer referencia a un objeto desde fuera del bloque. Aquí hay algo de código:
__block AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlock:^ {
if ([operation isCancelled]) {
return;
}
... do stuff ...
operation = nil;
}];
En este caso, el compilador da una advertencia de que el uso de 'operación' en el bloque va a conducir a un ciclo de retener. En ARC, __block ahora conserva la variable.
Si agrego __unsafe_unretained, el compilador libera el objeto inmediatamente, así que obviamente eso no funcionará.
Me estoy orientando a 4.0, por lo que no puedo usar __weak.
He intentado hacer algo como esto:
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
__block __unsafe_unretained AFHTTPRequestOperation *weakOperation = operation;
pero mientras weakOperation no es nula, ninguna de sus propiedades están llenando a medida que el interior del bloque.
¿Cuál es la mejor manera de manejar esta situación dadas las limitaciones del proyecto enumeradas anteriormente?
Tengo el problema de "no retener el ciclo" en mi mente, ni siquiera pensé en eso de la manera que me describiste. Duh. Siguiente pregunta: ¿alguna forma de silenciar la advertencia del compilador? Me volverá loco. – Hunter
Ver ["Controlar diagnósticos a través de Pragmas"] (http://clang.llvm.org/docs/UsersManual.html#diagnostics_pragmas) en el manual del usuario de Clang. Solo tendrá que averiguar qué indicador de advertencia ignorar. –
Es '#pragma clang diagnóstico ignorado" -Warc-retain-cycles "', por el. –