如果我将自动发布的对象桥接到 Core Foundation,我必须使用 __bridge 或 __bridge_retained 吗?

Posted

技术标签:

【中文标题】如果我将自动发布的对象桥接到 Core Foundation,我必须使用 __bridge 或 __bridge_retained 吗?【英文标题】:Must I use __bridge or __bridge_retained if I'm bridging an autoreleased object to Core Foundation? 【发布时间】:2012-02-09 04:57:48 【问题描述】:

ARC 迁移工具遇到问题:

NSURL *fileURL = [NSURL fileURLWithPath:path];
AudioFileOpenURL((CFURLRef)fileURL, kAudioFileReadPermission, 0, &fileID);

特别是,它不确定是否应该执行 __bridge 或 __bridge_retained。我也是。

-fileURLWithPath 返回一个自动释放的对象,在这个地方我不是 fileURL 的所有者。但同时,该对象的保留计数至少为 +1。

我敢打赌这只能用 __bridge 来完成。

【问题讨论】:

【参考方案1】:

您只想为此使用常规的__bridge 演员表。仅当您想管理强制转换 CF 对象的生命周期时,您才会使用 __bridge_retained。例如:

CFStringRef cf_string = (__bridge_retained CFStringRef)someNSString;
// some long time later, perhaps in another method etc
CFRelease(cf_string);

所以__bridge_retained 真的是在告诉编译器你有一个 ARC 对象,现在你想基本上把它变成一个你要直接管理的 CF 对象。

【讨论】:

以上是关于如果我将自动发布的对象桥接到 Core Foundation,我必须使用 __bridge 或 __bridge_retained 吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 freeswitch 将呼出呼叫桥接到会议

不能使用自动生成的 Swift 桥接头

Swift 无法将 NSNumber 桥接到 Float [重复]

桥接到 XMPP 的最佳架构是啥? [关闭]

如何使用 Core Data 设置 NSArrayController?

Swift 无法将 NSNumber 桥接到 Int