7

Il seguente codice compila bene con la gestione manuale della memoria, ma fallisce sotto ARC:Impostazione dei contenuti di un CALayer ad un CGImageRef su iOS con ARC sul

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

L'errore è:

automatica Riferimento conteggio Problema: la conversione implicita di un non Objective-C di tipo puntatore 'CGImageRef' (aka 'struct CGImage *') per 'id' non è consentita con ARC

Come posso farlo funzionare con ARC?

+1

Non ho usato ARC, ma hai provato che lo rende una conversione * * esplicita, il cast a '(id) '? – progrmr

risposta

17

objets CoreFoundation non sono gestiti da ARC. ARC funziona solo con oggetti Objective-C e non conosce implicitamente come trasferire la proprietà quando si esegue il cast da (o a) un tipo di puntatore non di oggetto.

È necessario dire ARC come la proprietà del objet viene trasferita durante il lancio:

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

appena lanciato il risultato di -CGImage a un ID, in quanto si lamenta conversioni implicite ...

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

Hhmm, il compilatore ha smesso di lamentarsi, ma qualche idea del perché questo è un no-no con ARC? – cfischer

+2

Poiché un 'id' rappresenta un 'struct objc_object *', dove un 'CGImageRef' rappresenta una' struct CGImage * '(che è un' struct objc_object * 'sotto le copertine), che non è un' struct objc_object * ' il compilatore non può convertire implicitamente un oggetto non (in particolare quello che viene mantenuto nella proprietà) in un oggetto. –

Problemi correlati