我需要释放Core Foundation对象来清理内存吗?如果是这样的话,应该如何释放?
比如在下面的代码中:
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
我需要释放peopleArray
吗?addressBook
呢?
我需要释放Core Foundation对象来清理内存吗?如果是这样的话,应该如何释放?
比如在下面的代码中:
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
我需要释放peopleArray
吗?addressBook
呢?
Core Foundation内存管理的规则与Cocoa中的类似:如果返回引用的方法包含“create”或“copy”一词,则您拥有该引用并必须调用CFRelease()
来放弃所有权。否则,您不拥有该引用,并且必须调用CFRetain
来获取所有权(必然需要随后的CFRelease
来放弃该新所有权)。这些规则来源于Core Foundation内存管理编程指南:
addressBook
和peopleArray
。由于Core Foundation中没有autorelease
的等效方法,如果您从方法返回引用,则应该不释放数组并返回它。除非你是故意这样做,否则你应该在方法名中包含"create"以指示调用者现在拥有返回对象的引用。在这种情况下,CFArray可以桥接到NSCFArray
,这是一个继承自NSObject
的Objective-C对象。因此,如果需要从函数/方法返回它,您可以将peopleArray
转换为NSArray*
并进行autorelease
操作。return [(NSArray*)peopleArray autorelease];
autorelease
(即使您可以使内存管理更加明确),那可能总是一件好事。是的,在CoreFoundation中,对于任何名称中带有Create或Copy的东西,您都需要进行释放。您可以使用CFRelease()来完成此操作。在您的情况下,您应该释放数组和通讯录引用。
还有一个小细节,目前还没有人提到过,一些CF类与它们的NS对应类有“toll-free bridge”的功能。例如CFString
和NSString
、CFArray
和NSArray
。这是相关的,因为您可以直接使用release
来释放这些类。
有关更多信息,请参见此StackOverflow问题。
return (__bridge_transfer NSArray*)peopleArray;