7

Poniższy kod kompiluje grzywny z ręcznego zarządzania pamięcią, ale nie pod łuku:Ustawianie zawartość CALayer do CGImageRef na iOS z ARC na

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

błędu jest:

Automatyczne Zliczanie odniesienia Problem: Pośrednie konwersja nie Cel C wskaźnik typu „CGImageRef” (znanego jako „struktura CGImage *”), aby „ID” jest zabronione ze ARC

Jak mogę to uruchomić z ARC?

+1

Nie używałem ARC ale próbowałeś czyni go * * wyraźną przemianę, rzucając go na '(id) '? – progrmr

Odpowiedz

17

CoreFoundation Objets nie są zarządzane przez ARC. ARC działa tylko z obiektami Objective-C i nie domyślnie wie, jak przenieść własność podczas rzutowania z (lub do) typu wskaźnika nieobiektowego.

Trzeba powiedzieć ARC jak własność Objet jest przenoszony podczas Obsada:

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

Wystarczy rzucić wyniku -CGImage do id, ponieważ narzeka niejawne konwersje ...

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

Hhmm, kompilator przestał się dziwiać, ale czy jest jakiś pomysł, dlaczego nie jest to możliwe z ARC? – cfischer

+2

Ponieważ 'id' reprezentuje' struct objc_object * ', gdzie' CGImageRef' reprezentuje 'struct CGImage *' (który jest strukturą 'struct objc_object *' pod okładką), który nie jest strukturą 'struct objc_object *' kompilator nie może niejawnie konwertować obiektu, który nie jest obiektem (szczególnie tego, który jest zatrzymany w tej właściwości). –