Devolver un CFTypeRef autorelease'd con ARC

Soy nuevo en contar automáticamente references con LLVM y Objective-C, y tengo una pregunta sobre cómo devolver CGImageRefs desde mi function Objective-C. En los días de recuento manual de reference, fue posible simplemente convertir el CGImageRef en un id , autorizarlo, y luego devolver el CGImageRef original. Con ARC, soy consciente de que puedes dirigir el sistema ARC para autorelease y devolver tu object retenible, pero no veo una manera de hacerlo para CFTypeRefs.

Esto es lo que pude hacer con ARC deshabilitado:

 - (CGImageRef)image { CGImageRef myImage; id myImageID = (id)myImage; [myImageID autorelease]; return myImage; } 

Entonces, quiero esencialmente crear un método que, usando ARC, devuelva un CGImageRef que no es propiedad de quien llama. Si hay una mejor manera de hacer lo mismo, estoy abierto a las ideas. Sé que UIImage hace algo así con la propiedad CGImage .

Editar: Aunque deshabilitar ARC para un file específico es un método válido para hacerlo, prefiero usar ARC puro en todo mi código. Esto resulta útil cuando se comparte un código específico para files específicos con otros, ya que no será necesario cambiar la configuration de compilation para un file determinado. Para aprovechar el sistema ARC para autorizar un CFTypeRef, puede hacer esto:

 __attribute__((ns_returns_autoreleased)) id CGImageReturnAutoreleased (CGImageRef original) { // CGImageRetain(original); return (__bridge id)original; } 

Y luego simplemente return (__bridge CGImageRef)CGImageReturnAutoreleased(myImage) para devolver una image autorelease'd.

ACTUALIZAR

A partir de OS X 10.9 y iOS 7.0, el SDK público incluye una function CFAutorelease .

ORIGINAL

Puede crear una function de utilidad como esta:

 void cfAutorelease(CFTypeRef *ref) { [[(id)ref retain] autorelease]; } 

y colóquelo en un file que compile con ARC deshabilitado. -fno-objc-arc pasar el indicador del comstackdor -fno-objc-arc para deshabilitar ARC para ese file. En Xcode 4, select su proyecto, luego la pestaña Crear fases. Abra la sección Comstackr orígenes. Haga doble clic en el file que contiene la function de utilidad y ponga -fno-objc-arc en el cuadro emergente.

Si está utilizando ARC , no se preocupe de autoreleasing el object,

 UIImage *image; image.CGImage 

siempre devuelve el object de autorelease mismo.

    Intereting Posts