7

Следующего кода компилируется нормально с ручным управлением памятью, но терпит неудачу под АРК:Настройка содержимого CALayer к CGImageRef на прошивке с АРК на

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

Ошибка является:

Автоматического Ссылка Counting Выпуск: Неявное преобразование типа указателя без Objective-C 'CGImageRef' (он же 'структура CGImage *') для 'ид' отвергается с ARC

Как это сделать с помощью ARC?

+1

Я не использовал ARC, но вы пробовали что делает его * явное преобразование *, отбрасывая его на '(идентификатор) '? – progrmr

ответ

17

CoreFoundation Objets не управляются АРК. ARC работает только с объектами Objective-C и не знает о том, как передать право собственности при кастовании с (или на) не-объектного типа указателя.

Вы должны сказать ARC, как передается право собственности на Objet во время заброса:

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

Просто отбрасывать результат от -CGImage к идентификатору, так как он жалуется на неявные преобразования ...

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

Хмм, компилятор действительно прекратил сукировать, но любая идея, почему это нет-нет с ARC? – cfischer

+2

Потому что 'id' представляет собой' struct objc_object * ', где' CGImageRef' представляет собой 'struct CGImage *' (который является 'struct objc_object *' под обложками), который не является 'struct objc_object *' компилятор не может неявно преобразовать не объект (особенно тот, который сохраняется в свойстве) объекту. –

Смежные вопросы