【问题标题】:Conversion between object and non-toll-free bridged types对象和非免费桥接类型之间的转换
【发布时间】:2013-01-16 03:55:56
【问题描述】:

众所周知,在免费桥接类型和诸如CFArrayRefNSArray 之类的objective-c 类型之间进行转换非常容易。昨天发现了一段代码,将CGImageRef(不是免工具桥接类型)转换为id,如下:

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

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

【问题讨论】:

    标签: iphone ios objective-c


    【解决方案1】:

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

    参见this document中的编译器处理从 Cocoa 方法返回的 CF 对象部分

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

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

    【讨论】:

    • 谢谢!虽然我是 Objective-c 的初学者,但你的答案对我来说很清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    相关资源
    最近更新 更多