¿ARC trabaja con los objects Core Graphics?

Hace poco comencé un nuevo proyecto utilizando el recuento automático de references (ARC).
Cuando asigné los contenidos de un CALayer:

UIView* view = ... UIImage* image = ... view.layer.contents = image.CGImage 

Tengo un error

La conversión implícita de un puntero que no sea de tipo Objectivo-C 'CGImageRef' a 'id' no está permitida con ARC

Simplemente lanzar el CGImageRef a id oculta el error, pero me preguntaba si el ARC todavía funciona correctamente, ¿verdad?

Realmente debería ver los videos ARC de WWDC 2011. Están disponibles en el sitio para desarrolladores y se abren a través de iTunes. Especialmente:

• Sesión 323: presentación del recuento automático de references

• Sesión 322 – Avances del Objetivo-C en Profundidad

Además, las notas de reference de ARC:

https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

Tanto las notas de reference como los videos discuten Core Graphics (et al) y cómo funcionan con ARC.

Específicamente, mira la sección llamada "Administrar el puente gratuito"

En muchas aplicaciones de Cocoa, debe usar objects del estilo Core Foundation, ya sea desde el marco Core Foundation (como CFArrayRef o CFMutableDictionaryRef) o desde frameworks que adopten convenciones de Core Foundation como Core Graphics (puede usar types como CGColorSpaceRef y CGGradientRef )

El comstackdor no gestiona automáticamente las vidas de los objects Core Foundation; debe llamar a CFRetain y CFRelease (o las variantes de tipo correspondientes) según lo dictan las reglas de administración de memory de Core Foundation (consulte la Guía de progtwigción de gestión de memory para Core Foundation).

Si lanzó objects Objective-C y Core Foundation, debe decirle al comstackdor sobre la semántica de propiedad del object utilizando un yeso (definido en objc / runtime.h) o una macro de estilo Core Foundation (definido en NSObject.h): […]

Jörg Jacobsen tiene un buen resumen general de las opciones de puente: Administrar el puente gratuito en un entorno ARC .

__bridge_retained (nb: solo lo usa cuando se lanza desde el puntero de object al puntero de tipo C): Yo (el progtwigdor) necesito hacer reference a este object durante un time en el mundo oscuro de pointers de tipo C que es opaco para usted, ARC. Entonces, por favor, no publiques este object mientras todavía lo necesito. Yo (el progtwigdor) prometo lanzarlo yo mismo (en el mundo oscuro) cuando termine con él

__bridge_transfer (nb: solo lo usa cuando se lanza desde puntero de tipo C al puntero de object): I (el progtwigdor) le entrego, ARC, un object que tengo y que ya no estoy interesado en el mundo oscuro de tipo C Punteros que son opacos para usted. Cuando tú, ARC, termines con ese object, por favor, libéralo tú mismo, porque sabes el momento adecuado y así me salvas un trabajo sin tener que hacerlo yo mismo.

__bridge : ARC, sigues equilibrando tus retenciones y liberaciones mientras sigo equilibrando las mías en el mundo oscuro de pointers tipo C que es … Cada vez que necesito aferrarte a un object en el mundo oscuro, yo mismo lo retendré y lo liberaré cuando corresponda. No necesito ningún contrato adicional contigo, ARC.

A pesar de las references señaladas por Steve, creo que el caso que muestre arriba podría ser especial. Desde la transición a las notas de la versión ARC , preste atención a la sección "El comstackdor maneja objects CF devueltos de methods de cocoa":

El comstackdor entiende los methods de Objective-C que devuelven los types de Core Foundation siguiendo las convenciones históricas de nombres de Cocoa (ver Guía avanzada de progtwigción de administración de memory). Por ejemplo, el comstackdor sabe que, en iOS, el CGColor devuelto por el método CGColor de UIColor no es propiedad.

El ejemplo de código que proporcionan:

 gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor], (id)[[UIColor lightGrayColor] CGColor], nil]; 

se basa en el conocido retorno de CGColors a partir de estos methods (faltan el elenco a id que he agregado en el código anterior, que debería corregirse pronto en su documentation).

Debido a que [image CGImage] sigue las convenciones de nomenclatura, creo que CGImage se puenteará correctamente aquí. Creo que tu reparto a id debería ser todo lo que necesitas aquí.

Una respuesta popular a layer.contents = (id)image.CGImage question es layer.contents = obj_unretainedObject(image.CGImage) .

Hago =(__bridge id)image.CGImage .