发布Core Foundation对象引用

时间:2009-05-15 18:47:39

标签: objective-c cocoa cocoa-touch core-foundation

我是否需要发布Core Foundation对象来清理内存?如果是这样,怎么样?

例如,在代码中:

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);

我是否需要发布peopleArray?那么addressBook呢?

5 个答案:

答案 0 :(得分:26)

是的,在CoreFoundation中,您必须在名称中使用“创建”或“复制”发布任何内容。你用CFRelease()做到这一点。在您的情况下,您应该释放数组和地址簿引用。

答案 1 :(得分:26)

Core Foundation中用于内存管理的rules与Cocoa中的类似:如果返回引用的方法包含单词“create”或“copy”,则您拥有该引用并且必须调用{{1关于放弃所有权的参考。否则,您拥有该引用,并且必须致电CFRelease()以取得所有权(必须要求后续CFRetain放弃该新所有权)。这些规则取自“核心基金会内存管理编程指南”:

  • 如果你创建一个对象(或者 直接或通过复制 另一个对象 - 见“创造 规则“),你拥有它。
  • 如果你得到了 来自其他地方的物体,你这样做 不拥有它。如果你想阻止它 被处置,你必须补充 自己作为所有者(使用 CFRetain)。
  • 如果您是某人的所有者 对象,你必须放弃所有权 当你完成使用它 (使用CFRelease)。

在您的示例中,必须释放CFReleaseaddressBook。由于Core Foundation中没有peopleArray等效项,如果从方法返回引用,则返回数组而不用释放它。您应该(除非您是邪恶的)然后在方法名称中包含“create”以向调用者指示他们现在拥有对返回对象的引用。在这种情况下,CFArray是免费的桥接到autorelease,一个继承自NSCFArray的Objective-C对象。因此,如果您需要从函数/方法返回NSObjectpeopleArray,则可以NSArray*投射autorelease

return [(NSArray*)peopleArray autorelease];

请注意,这仅适用于免费桥接类。我的理解是,制作自己的免费桥接类并且只有原始(字符串,数组等)CF类是免费桥接是相当困难的,因此这种方法不会总是有效。最后,如果你可以避免使用autorelease(即你可以使你的记忆管理更加明确),那可能总是一件好事。

答案 2 :(得分:4)

还没有人提到的另一个小问题,一些CF课程与他们的NS同行有一个“免费桥梁”。 CFStringNSStringCFArrayNSArray都是示例。这是相关的,因为您可以将release与这些类一起使用。

有关详细信息,请参阅此other StackOverflow question

答案 3 :(得分:3)

我建议在Core Foundation内存管理上阅读Apple的guide,以便对此进行深入讨论。他们也有类似的一般Cocoa内存管理指南。

要释放CF对象,您可以调用CFRelease函数。

答案 4 :(得分:3)

对于ARC,您可以使用。

return (__bridge_transfer NSArray*)peopleArray;

“__ bridge_transfer”会将所有权转移到ARC,因此您不需要任何进一步的释放呼叫。