我是否需要发布Core Foundation对象来清理内存?如果是这样,怎么样?
例如,在代码中:
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
我是否需要发布peopleArray
?那么addressBook
呢?
答案 0 :(得分:26)
是的,在CoreFoundation中,您必须在名称中使用“创建”或“复制”发布任何内容。你用CFRelease()做到这一点。在您的情况下,您应该释放数组和地址簿引用。
答案 1 :(得分:26)
Core Foundation中用于内存管理的rules与Cocoa中的类似:如果返回引用的方法包含单词“create”或“copy”,则您拥有该引用并且必须调用{{1关于放弃所有权的参考。否则,您不拥有该引用,并且必须致电CFRelease()
以取得所有权(必须要求后续CFRetain
放弃该新所有权)。这些规则取自“核心基金会内存管理编程指南”:
在您的示例中,必须释放CFRelease
和addressBook
。由于Core Foundation中没有peopleArray
等效项,如果从方法返回引用,则返回数组而不用释放它。您应该(除非您是邪恶的)然后在方法名称中包含“create”以向调用者指示他们现在拥有对返回对象的引用。在这种情况下,CFArray是免费的桥接到autorelease
,一个继承自NSCFArray
的Objective-C对象。因此,如果您需要从函数/方法返回NSObject
和peopleArray
,则可以NSArray*
投射autorelease
:
return [(NSArray*)peopleArray autorelease];
请注意,这仅适用于免费桥接类。我的理解是,制作自己的免费桥接类并且只有原始(字符串,数组等)CF类是免费桥接是相当困难的,因此这种方法不会总是有效。最后,如果你可以避免使用autorelease
(即你可以使你的记忆管理更加明确),那可能总是一件好事。
答案 2 :(得分:4)
还没有人提到的另一个小问题,一些CF课程与他们的NS同行有一个“免费桥梁”。 CFString
和NSString
,CFArray
和NSArray
都是示例。这是相关的,因为您可以将release
与这些类一起使用。
有关详细信息,请参阅此other StackOverflow question。
答案 3 :(得分:3)
我建议在Core Foundation内存管理上阅读Apple的guide,以便对此进行深入讨论。他们也有类似的一般Cocoa内存管理指南。
要释放CF对象,您可以调用CFRelease
函数。
答案 4 :(得分:3)
对于ARC,您可以使用。
return (__bridge_transfer NSArray*)peopleArray;
“__ bridge_transfer”会将所有权转移到ARC,因此您不需要任何进一步的释放呼叫。