ACTUALIZACIÓN: ¡Este problema se ha corregido a partir de Xcode 4.6!strong @property con __attribute __ ((NSObject)) para un tipo CF no retiene
Esta técnica ahora funciona como estaba previsto de nuevo. Sin embargo, asegúrese de leer las notas en la parte superior de la excelente respuesta de Rob Napier antes de usarlo en su código.
Post original
(ARC, Xcode 4.3.1, iOS 5.1)
que tienen una fuerte propiedad de un tipo CF (CGImage) que yo quiero ser manejados automáticamente por arco utilizando __attribute__((NSObject))
(como si se hubiera conservado la liberación & en el setter sintetizado, y no se trata en dealloc), pero no funciona: el objeto no se conserva cuando asigno la propiedad.
Un ejemplo mínimos para reproducir:
@interface TestClass : NSObject
@property (nonatomic, strong) __attribute__((NSObject)) CFStringRef str;
@end
// ...In some function
CFStringRef str = (__bridge CFStringRef)[NSString stringWithFormat:@"%g", 2.5];
NSLog(@"%ld", CFGetRetainCount(str));
TestClass *obj = [[TestClass alloc] init];
obj.str = str;
NSLog(@"%ld", CFGetRetainCount(str));
que imprime '1' dos veces.
Ahora lo extraño es que (aunque no estoy seguro de esto) Creo que funcionó correctamente antes he actualizado a iOS 5.1 & Xcode 4.3.1 (de iOS 5 & Xcode 4.2), y con él pasó de gdb a lldb. ¿Puede alguien que no se haya actualizado (o sepa cómo cambiar el compilador) quizás confirme?
Una solución sería simplemente usar una propiedad 'NSString *', y usar un molde '__bridge' al asignar. – jtbandes
ahora no recibo nada de [este enlace] (http://clang.llvm.org/docs/AutomaticReferenceCounting.html#objects.operands.casts) espera que llegue algo –
Bueno, lamentablemente esto es sólo un ejemplo para reproducir, en mi código real que estoy usando tengo un CGImage. Editaré la publicación. –