7

El siguiente código compila bien con la gestión de memoria manual, pero falla bajo ARC:Ajuste el contenido de un CALayer a un CGImageRef en IOS con ARC en

CALayer *layer = [CALayer layer]; 
layer.contents = [[UIImage imageNamed:@"dial.png"] CGImage]; 

El error es:

automática Recuento de referencia de emisión: conversión implícita de un no Objective-C tipo de puntero 'CGImageRef' (también conocido como 'CGImage struct *') a 'id' no está permitido con ARC

¿Cómo puedo ejecutar esto con ARC?

+1

No he utilizado ARC pero has necesitado lo que es un * * conversión explícita, echándola a '(id) '? – progrmr

Respuesta

17

objetos CoreFoundation no son manejados por ARC. ARC solo funciona con objetos Objective-C y no sabe implícitamente cómo transferir la propiedad al convertir desde (o hacia) un tipo de puntero no objeto.

es necesario decirle ARC cómo la propiedad del objet se transfiere durante el reparto:

layer.contents = (__bridge id) [[UIImage imageNamed:@"dial.png"] CGImage]; 
1

Sólo echado el resultado de -CGImage a una identificación, ya que se quejaba de las conversiones implícitas ...

layer.contents = (id) [[UIImage imageNamed:@"dial.png"] CGImage]; 
+1

Hhmm, el compilador dejó de putear, pero ¿hay alguna idea de por qué esto es un no-no con ARC? – cfischer

+2

Porque un 'id' representa un' struct objc_object * ', donde un' CGImageRef' representa una 'struct CGImage *' (que es un 'struct objc_object *' debajo de las cubiertas), que no es un 'struct objc_object *' el compilador no puede convertir implícitamente un no objeto (especialmente uno que se retiene en la propiedad) a un objeto. –

Cuestiones relacionadas