假设仍然存在未完成的强引用,这是否会导致泄漏,因为没有人(ARC 和我)不再管理该对象?
CFTypeRef cf_object = CFBridgingRetain(arc_object);
// do stuff
CFRelease(cf_object);
假设仍然存在未完成的强引用,这是否会导致泄漏,因为没有人(ARC 和我)不再管理该对象?
CFTypeRef cf_object = CFBridgingRetain(arc_object);
// do stuff
CFRelease(cf_object);
要回答您的问题,上面的代码看起来不错。CFRelease
当你在做 CF 时,你需要做 a Create
,Retain
或者Copy
. 正如 Rob 建议的那样,您还可以查看CFBridgingRelease
. 有关 ARC 更改的更多详细信息,您可以查看此Raywenderlich 教程。
根据苹果CFBridgingRetain
文档,
将 Objective-C 指针转换为 Core Foundation 指针,并将所有权转移给调用者。
CFTypeRef CFBridgingRetain(id X)
讨论: 您使用此函数将 Objective-C 对象转换为 Core Foundation 样式的对象并获取该对象的所有权,以便您可以管理其生命周期。您负责随后释放该对象。
在这里,您需要释放cf_object
哪个 ARC 不会处理它。一旦你调用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
在这里管理。
在您修改后的问题中,您提供的代码没有泄漏。您使用 将 Objective-C 对象转换为 Core Foundation 指针,CFBridgingRetain
增加了进程中核心基础对象的保留计数。但是,你用 a 平衡了它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+ command+调用B)非常擅长诊断代码是否存在泄漏,包括桥接和核心基础。