2

正如我们所知,在免费桥接类型和 Objective-c 类型(例如CFArrayRef和)之间进行转换非常容易NSArray。昨天,我发现了一段代码可以将CGImageRef(不是免工具桥接类型)转换id为如下:

CALayer *imgLayer = [CALayer layer];  
imgLayer.contents = (id)aImage.CGImage;

但是,它工作正常。但我不明白,因为CGImageRef根据苹果的文档,它不属于免费桥接类型。看第二行代码,imgLayer应该保留赋值给属性内容的值。因为CGImageRef被转换为id所以我认为在属性内容的 setter 方法中,它会像这样向该对象发送保留消息[xxx retain]。但aImage.CGImage不是一个对象,所以我认为这个保留消息不会正确执行(但它会)。所以我的问题是这种转换背后的实际行动是什么?

4

1 回答 1

2

这些方法是 Apple 为方便起见而添加的规则的一个例外。由于编译器知道 Objective-C 命名约定和隐含的内存管理,因此 Objective-C 函数返回的 Core Foundation 对象将被自动转换并正确处理。

请参阅本文档的编译器处理从 Cocoa 方法返回的 CF 对象部分

免费桥接是一个有点过时的术语。它指的是Core Foundation C 对象和Objective-C 对象之间的无缝转换。但是,使用 ARC,转换不再那么无缝,因为编译器需要在桥接相应对象后提示如何处理它们。但是,在这种情况下,它从方法的命名约定中获得提示。

此外,所有 Core Foundation 对象本质上都可以转换为 Objective-C 对象。如果没有相应的类型,那么它们将简单地变成一个特殊的包罗万象的类(NSCFType),就是为此目的而设计的。

于 2013-01-16T04:00:01.160 回答