我正在编写旨在在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。
它似乎确实有效。这段代码好吗?
答案 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漏洞工具的确认或拒绝。
安德鲁