【问题标题】:Dual mode ARC/GC and Core Foundation bridging双模式 ARC/GC 和 Core Foundation 桥接
【发布时间】:2012-03-17 02:54:36
【问题描述】:

我正在编写旨在在 ARC 和垃圾收集下工作的代码。

这是一段使用 Core Foundation 的代码,因为它可能是专门为 ARC 编写的:

CFTypeRef ref=CFCopySomething();
// At this point ref has retain count 1.
id obj=(__bridge_transfer id)ref;
// Ref still has retain count 1 but is now managed by ARC.
[obj doSomething];
// ARC will release ref when done.

这似乎相当于:

CFTypeRef ref=CFCopySomething();
// At this point ref has retain count 1.
id obj=(__bridge id)ref;
// Now ref has retain count 2 due to assigning to strong variable under ARC.
CFRelease(ref)
// Now ref has retain count 1.
[obj doSomething];
// ARC will release ref when done.

后者的好处是 CFRelease 调用允许 GC 收集对象。但我不确定在通过桥接分配转移到 ARC 后调用 CFRelease。

这似乎确实有效。这段代码可以吗?

【问题讨论】:

  • 值得一提的是,__bridge 强制转换对非 ARC 编译单元没有任何意义,即编译器在使用--objc-gc 编译时会简单地忽略它们,从而使您的第二个代码 sn- p 与 ARC 和 GC 兼容。 (只是说因为我不得不搜索。)

标签: objective-c garbage-collection automatic-ref-counting core-foundation


【解决方案1】:

您的第二个代码 sn-p 是正确的,并且确实是处理 ARC 和 GC 的最佳方法。您也可以在创建对象时使用 CFMakeCollectable,然后按如下方式完成 CFRelease:

if ([NSGarbageCollector defaultCollector] == NULL) CFRelease(myCFString)

但我更喜欢你所拥有的,只需一个适用于两种环境的调用。

【讨论】:

    【解决方案2】:

    尼克,

    由于 ARC 不处理 CFObject,您实际上可能希望在此处保留手动管理的代码。 ARC 真正专注于 Cocoa 而不是 Core Foundation。也就是说,您说代码有效,但它会泄漏吗?请记住,带有错误编译器标志的 ARC 代码会因泄漏而失败。在此 Apple 文档中,他们声称 ARC 不管理 CF 对象:https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html。因此,我认为您的 __bridge 代码泄漏,并等待您从 Instruments 的泄漏工具中确认或拒绝。

    安德鲁

    【讨论】:

    • 我可以确认在ARC下编译时代码没有泄漏。
    • 尼克,好的,很高兴你确认了这一点。对于您的 GC 问题,由于您的 CFRelease 可以在您最后一次使用后的任何地方发生,您为什么将它放在您最后一次使用之前并希望 ARC/GC 解决它?如果您只是坚持 CF 对象的标准模式,那么您不必考虑 ARC v GC 问题。 IOW,在您的第二个区块中,将 CFRelease 移动到您需要该项目的最后一点。 ARC 和 GC 都不会比你聪明得多。 (顺便说一句,我认为您的桥接分配只会更改名称。没有更改分配语义。)安德鲁
    • 在 GC 下,需要 CFRelease 才能将 CF 对象标记为可收集。通常在创建时执行此操作(通常使用 CF/NSMakeCollectable,但 CFRelease 也可以)。同样,对于 ARC,我想尽快将对象移交给 ARC。这一切都确实有效。
    • 尼克,很高兴它对你有用。 GC不是异步过程吗?没有参考资料或已成为收藏品的物品不能随时收割吗?虽然早期收获的可能性很小,但它可以并且在某些系统上将会发生。手动处理 CF 对象的确定性是否值得将版本移动到最后一次使用之后?安德鲁
    • 关于 GC,是的,它是异步的,但它会跟踪实际使用的对象。这很聪明!它甚至可以在 CF 对象上工作,一旦你已经 CFReleased 它们。很遗憾它被弃用了,真的。虽然 ARC 是一个很棒的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2011-10-25
    • 2023-03-17
    • 2012-04-16
    • 1970-01-01
    • 2019-03-03
    • 2011-10-12
    相关资源
    最近更新 更多