Pregunta

Recientemente comencé un nuevo proyecto utilizando Contado de referencia automático (ARC).
Cuando asigné el contenido de un calayer:

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

Tengo un error

La conversión implícita de un tipo de puntero no objetivo-C 'CGIMAGEREF' a 'ID' está rechazada con ARC

Simplemente lanzando el CGImageRef a id Oculta el error, pero me preguntaba si el arco todavía funciona correctamente entonces.

¿Fue útil?

Solución

Realmente debe ver los videos de ARC de WWDC 2011. Están disponibles en el sitio del desarrollador y se abren a través de iTunes. Especialmente:

• Sesión 323 - Introducción de recuento automático de referencias

• Sesión 322-Objetivo-C Avances en profundidad

Además, las notas de referencia del arco:

https://developer.apple.com/library/content/releasenotes/objectivec/rn-transitioningtoarc/introduction/introduction.html

Tanto las notas de referencia como los videos discuten los gráficos principales (et al) y cómo funcionan con ARC.

Específicamente, mire la sección llamada "Gestión de puentes sin cargo"

En muchas aplicaciones de cacao, debe utilizar objetos de estilo fundamental central, ya sea desde el marco básico de la base en sí (como cfarrayref o cfmutableRictionRef) o de los marcos que adoptan convenciones básicas de base como gráficos centrales (puede usar tipos como CGColorSpacereF y CGGradientRef ).

El compilador no gestiona automáticamente las vidas de los objetos básicos de base; Debe llamar a CFRetain y CFRelease (o las variantes específicas de tipo correspondientes) según lo dictado por las reglas de gestión de memoria de Core Foundation (consulte la Guía de programación de gestión de memoria para Core Foundation).

Si se lanza entre objetos de estilo de Fundación Objective-C y Core, debe informar al compilador sobre la semántica de propiedad del objeto utilizando un elenco (definido en OBJC/Runtime.h) o una macro de estilo fundamental central (definido en Nsobject.h): [...

Jörg Jacobsen también tiene una buena descripción resumida de las opciones de puente: Gestión de puentes sin cargo en un entorno arco.

__bridge_eturned (NB: solo úselo al lanzar desde el puntero de objeto al puntero de tipo C): I (el programador) Necesita hacer referencia a este objeto durante algún tiempo en el mundo oscuro de los punteros de tipo C que es opaco para usted, arco. Así que por favor, por favor no suelte este objeto mientras lo necesito. Yo (el programador) prometo lanzarlo yo mismo (en el mundo oscuro) cuando termine con él

__bridge_transfer (NB: solo úsalo al lanzar desde el puntero de tipo C al puntero de objeto): I (el programador) te entregue, arco, un objeto que tengo y que ya no estoy interesado en el mundo oscuro de los punteros de tipo C Eso es opaco para ti. Cada vez que usted, arco, termina con ese objeto, por favor, libérelo usted mismo, porque conoce el momento adecuado y así me ahorras un trabajo sin tener que hacerlo yo mismo.

__puente: Arc, sigues equilibrando tus retrasos y lanzamientos mientras sigo equilibrando el mío en el mundo oscuro de los punteros de tipo C que es ... Siempre que necesito aferrarme a un objeto en el mundo oscuro, lo conservaré yo mismo y lo liberaré cuando sea apropiado. No necesito ningún contrato adicional con usted, arco.

Otros consejos

A pesar de las referencias señaladas por Steve, creo que el caso que muestra anteriormente podría ser especial. Desde el Transición a las notas de lanzamiento de arco, preste atención a la sección "El compilador maneja los objetos CF devueltos de los métodos de cacao":

El compilador comprende los métodos de objetivos-C que devuelven los tipos de fundamento central siguen las convenciones históricas de nombres de cacao (consulte la Guía de programación de gestión de memoria avanzada). Por ejemplo, el compilador 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 retorno conocido de CGColors de estos métodos (se les falta el elenco a ID que he agregado en el código anterior, que debería corregirse pronto en su documentación).

Porque [image CGImage] Sigue las convenciones de nombres, creo que la CGIMAGE se unirá correctamente aquí. Creo que tu elenco a ID debería ser todo lo que necesitas aquí.

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

hago =(__bridge id)image.CGImage.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top