对于CFBridgeRetained只有CFReleased的ARC对象会发生什么?

时间:2013-01-05 18:57:32

标签: ios macos memory automatic-ref-counting core-foundation

假设仍然存在优秀的强引用,这是否会导致泄漏,因为没有人(ARC和我都没有)正在管理对象?

 CFTypeRef cf_object = CFBridgingRetain(arc_object);
 // do stuff
 CFRelease(cf_object);

2 个答案:

答案 0 :(得分:3)

要回答您的问题,上面的代码看起来很好。当您执行CF CFReleaseCreateRetain时,您需要Copy。正如Rob建议您也可以查看CFBridgingRelease的用法。有关ARC更改的更多详细信息,您可以查看此Raywenderlich tutorial

根据CFBridgingRetain的{​​{3}},

  

将Objective-C指针强制转换为Core Foundation指针   将所有权转让给来电者。

CFTypeRef CFBridgingRetain(id X)
  

<强>讨论:   您可以使用此函数将Objective-C对象强制转换为Core   基础风格的对象并取得对象的所有权以便您   可以管理它的一生。您随后负责   释放物体。

在这里你需要释放ARC不会处理它的cf_object。致电CFRelease后,它将被释放。

CFBridgingRelease

上的

apple documentation

  

将非Objective-C指针移动到Objective-C并进行传输   对ARC的所有权。

id CFBridgingRelease(CFTypeRef X)
  

讨论:您可以使用此函数将Core Foundation样式的对象转换为Objective-C对象并转移对象的所有权   到ARC,这样你就不必释放对象了。

请注意,当您使用CFBridgingRelease时,它会将所有权转移到ARC,ARC会对其进行管理。

例如: -

CFStringRef cfName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *name = (NSString *)CFBridgingRelease(cfName);

ARC将在此管理name

答案 1 :(得分:2)

在您修改的问题中,您提供的代码没有泄漏。您使用CFBridgingRetain将Objective-C对象转换为Core Foundation指针,从而增加核心基础对象在此过程中的保留计数。但是,你用CFRelease来平衡它,这会再次减少保留计数(当保留计数为零时,它将被释放),所以一切都很好。没有泄漏。

最重要的是,这个小核心基金会往返cf_object不会对ARC对arc_object的管理产生负面影响。

所以,你的问题是:

  

假设仍然存在优秀的强引用,这是否会导致泄漏,因为没有人(ARC和我都没有)正在管理对象?

有几点想法:

  1. ARC从不管理Core Foundation对象cf_object。你是。通过致电CFRelease,您已履行了自己的职责。

  2. ARC从未停止管理Objective-C对象arc_object。它仍然是。当删除所有强引用(包括任何Core Foundation保留)时,该对象将被释放。

  3. 您的问题前面有关于其他强引用的评论。这与泄漏,Core Foundation手动管理内存等问题无关。如果您的Core Foundation相关代码无法清理并导致泄漏,那么无论其他强引用如何,都会这样做(尽管如此,在删除所有其他强引用之前,您通常不会真正体验/检测泄漏。

  4. 这个问题意味着您担心代码中的泄漏以及Core Foundation对象和函数的使用。静态分析器(Xcode的“产品”菜单上的“分析”,或通过按 shift + 命令 + B 调用)非常适合诊断泄漏代码,包括您的桥接和Core Foundation。