Objective c 可以管理非免费桥接核心基础物体? 如果我有一个不收费的桥接核心基础对象,我可以安全地将所有权转移给ARC,还是保留免费桥接类型的特权?

Objective c 可以管理非免费桥接核心基础物体? 如果我有一个不收费的桥接核心基础对象,我可以安全地将所有权转移给ARC,还是保留免费桥接类型的特权?,objective-c,automatic-ref-counting,Objective C,Automatic Ref Counting,例如: - (id)myBundle { CFBundleRef b = CFBundleCreate(NULL, self.bundleURL); return b == NULL ? nil : (__bridge_transfer id)b; } - (UInt32)myBundleVersionNumber { return CFBundleGetVersionNumber((__bridge CFBundleRef)self.myBundle); } 每个C

例如:

- (id)myBundle {
    CFBundleRef b = CFBundleCreate(NULL, self.bundleURL);
    return b == NULL ? nil : (__bridge_transfer id)b;
}

- (UInt32)myBundleVersionNumber {
    return CFBundleGetVersionNumber((__bridge CFBundleRef)self.myBundle);
}

每个CoreFoundation对象(
CFTypeRef
)也是Objective-C对象(
id

在过去,在10.9中引入
CFAutorelease()
之前,非ARC代码将使用
[(id)autorelease]
习惯用法自动释放CoreFoundation对象,这是可能的,因为CoreFoundation对象是Objective-C对象

这种对应关系就是为什么在ARC中,CoreFoundation对象可以
\uu bridge\u transfer
”传输到ARC

所以答案是肯定的,您可以安全地将任何CoreFoundation对象的所有权转移给ARC

如果您在汇编程序级别逐步浏览示例代码,您会发现ARC调用
\u objc\u release
,而这反过来又会调用
CFRelease


注释:免费桥接对象是CoreFoundation和Objtovi-C中有完全相同的对象,因此它们可以互换使用。

另一种方式, CFType ,核心基础的“基类”是免费的桥接到<代码> NSbObjs<代码> > @ KeSeMasase-是的,但不幸的是,它没有被列在免费桥接类型的列表中,所以我选择了更冗长的解释。当然。“这不是批评,只是补充,”肯特·霍马斯说,“这不是一个批评,没问题。”。只是如果苹果真的把它放在他们的桌子上会很好,那么答案可能会更短!请注意,并非所有Cocoa对象都是NSObject的子类(例如NSProxy和OSObject),并且一些CF对象不一定是免费桥接到其Cocoa计数器部件的(例如Cbundle NSBundle)。肯特的评论是错误的:CFType并不是免费桥接到NSObject的。