正如我们所知,在免费桥接类型和目标c类型(如CFArrayRef
和NSArray
)之间进行转换非常容易。昨天,我找到了一段代码,将CGImageRef
(不是免工具的桥接类型)转换为id
,如下所示:
CALayer *imgLayer = [CALayer layer];
imgLayer.contents = (id)aImage.CGImage;
然而,它工作正常。但我不明白,因为根据苹果的文件,CGImageRef
不属于免费桥接类型。查看第二行代码,imgLayer
应保留分配给属性内容的值。因为CGImageRef
转换为id
所以我认为在属性内容的setter方法中,它会向该对象发送一条保留消息,如[xxx retain]
。但是aImage.CGImage
不是一个对象,所以我不认为这个保留消息会正确执行(不过它会)。所以我的问题是这次转换背后的实际行动是什么?
答案 0 :(得分:2)
这些方法是Apple为方便起见而添加的规则的例外。由于编译器了解Objective-C命名约定和隐含的内存管理,因此Objective-C函数返回的Core Foundation对象将自动转换并正确处理。
中的编译器处理从Cocoa方法返回的CF对象部分免费接听是一个过时的术语。它提到了Core Foundation C对象和Objective-C对象之间的无缝连接。但是,使用ARC时,转换不再是无缝的,因为编译器需要提示在桥接它们之后如何处理相应的对象。但是,在这种情况下,它会从方法的命名约定中获得提示。
此外,所有Core Foundation对象基本上都可以转换为Objective-C对象。如果没有相应的类型,那么它们将简单地成为为此目的而设计的特殊的全能类(NSCFType
)。