Estoy escribiendo código destinado a funcionar tanto bajo ARC como en Garbage Collection.Puente ARC/GC de Dual Mode y Core Foundation
Aquí hay un poco de código que utiliza base fundamental, ya que podría ser escrito específicamente para ARC:
CFTypeRef ref=CFCopySomething();
// At this point ref has retain count 1.
id obj=(__bridge_transfer id)ref;
// Ref still has retain count 1 but is now managed by ARC.
[obj doSomething];
// ARC will release ref when done.
Parece que esto es equivalente a:
CFTypeRef ref=CFCopySomething();
// At this point ref has retain count 1.
id obj=(__bridge id)ref;
// Now ref has retain count 2 due to assigning to strong variable under ARC.
CFRelease(ref)
// Now ref has retain count 1.
[obj doSomething];
// ARC will release ref when done.
El beneficio de este último que la llamada CFRelease permite que el GC recoja el objeto. Pero no estoy seguro de llamar al CFRelease después de transferirlo a ARC con la asignación de bridge-casted.
Parece que funciona. ¿Está bien este código?
Vale la pena mencionar a los lectores que los títulos '__bridge' no tienen ningún significado en las unidades de compilación que no son ARC, es decir, el compilador simplemente los ignorará al compilar con' -objc-gc', haciendo que su segundo fragmento de código sea compatible tanto ARC como GC. (Solo digo eso porque tuve que buscar) – paulotorrens