假设仍然存在优秀的强引用,这是否会导致泄漏,因为没有人(ARC和我都没有)正在管理对象?
CFTypeRef cf_object = CFBridgingRetain(arc_object);
// do stuff
CFRelease(cf_object);
答案 0 :(得分:3)
要回答您的问题,上面的代码看起来很好。当您执行CF CFRelease
,Create
或Retain
时,您需要Copy
。正如Rob建议您也可以查看CFBridgingRelease
的用法。有关ARC更改的更多详细信息,您可以查看此Raywenderlich tutorial。
根据CFBridgingRetain
的{{3}},
将Objective-C指针强制转换为Core Foundation指针 将所有权转让给来电者。
CFTypeRef CFBridgingRetain(id X)
<强>讨论:强> 您可以使用此函数将Objective-C对象强制转换为Core 基础风格的对象并取得对象的所有权以便您 可以管理它的一生。您随后负责 释放物体。
在这里你需要释放ARC不会处理它的cf_object
。致电CFRelease
后,它将被释放。
CFBridgingRelease
上的将非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和我都没有)正在管理对象?
有几点想法:
ARC从不管理Core Foundation对象cf_object
。你是。通过致电CFRelease
,您已履行了自己的职责。
ARC从未停止管理Objective-C对象arc_object
。它仍然是。当删除所有强引用(包括任何Core Foundation保留)时,该对象将被释放。
您的问题前面有关于其他强引用的评论。这与泄漏,Core Foundation手动管理内存等问题无关。如果您的Core Foundation相关代码无法清理并导致泄漏,那么无论其他强引用如何,都会这样做(尽管如此,在删除所有其他强引用之前,您通常不会真正体验/检测泄漏。
这个问题意味着您担心代码中的泄漏以及Core Foundation对象和函数的使用。静态分析器(Xcode的“产品”菜单上的“分析”,或通过按 shift + 命令 + B 调用)非常适合诊断泄漏代码,包括您的桥接和Core Foundation。