3

假设仍然存在未完成的强引用,这是否会导致泄漏,因为没有人(ARC 和我)不再管理该对象?

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

2 回答 2

3

要回答您的问题,上面的代码看起来不错。CFRelease当你在做 CF 时,你需要做 a CreateRetain或者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在这里管理。

于 2013-01-05T19:22:15.683 回答
2

在您修改后的问题中,您提供的代码没有泄漏。您使用 将 Objective-C 对象转换为 Core Foundation 指针,CFBridgingRetain增加了进程中核心基础对象的保留计数。但是,你用 a 平衡了它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 相关代码代码未能清理并导致泄漏,它会这样做,而不管其他强引用(尽管,诚然,在删除所有其他强引用之前,您通常不会真正体验/检测到泄漏)。

这个问题意味着您担心代码中的泄漏以及 Core Foundation 对象和函数的使用。静态分析器(Xcode 的“产品”菜单上的“分析”,或按shift+ command+调用B)非常擅长诊断代码是否存在泄漏,包括桥接和核心基础。

于 2013-01-05T19:33:26.927 回答