双模式ARC / GC和Core Foundation桥接

时间:2012-02-27 16:17:43

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

我正在编写旨在在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。

它似乎确实有效。这段代码好吗?

2 个答案:

答案 0 :(得分:2)

您的第二个代码段是正确的,实际上是处理ARC和GC的最佳方式。您还可以在创建对象时使用CFMakeCollectable,然后按如下方式完成CFRelease:

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

但我更喜欢你所拥有的只有一个适用于这两种环境的电话。

答案 1 :(得分:1)

尼克,

由于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漏洞工具的确认或拒绝。

安德鲁