在iOS上使用ARC将CALayer的内容设置为CGImageRef

8
以下代码在手动内存管理下编译良好,但在ARC下失败:
CALayer *layer = [CALayer layer];
layer.contents = [[UIImage imageNamed:@"dial.png"] CGImage];

错误信息如下:

自动引用计数问题:禁止使用 ARC 将非 Objective-C 指针类型 'CGImageRef'(即 'struct CGImage *')隐式转换为 'id'

如何在 ARC 环境中运行该代码?

1
我没有使用ARC,但你尝试过将其转换为显式转换并将其强制转换为(id)吗? - progrmr
2个回答

18

CoreFoundation对象不受ARC管理。ARC仅适用于Objective-C对象,并且在从(或转换为)非对象指针类型时不会隐式地知道如何传输所有权。

您需要告诉ARC在强制类型转换期间如何传输对象的所有权:

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

1

只需将-CGImage的结果转换为id类型,因为它正在抱怨隐式转换...

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 *,因此编译器无法隐式地将非对象(特别是在属性中被保留的对象)转换为对象。 - Richard J. Ross III

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接