2012-04-18 73 views
10

我正在学习iOS编程。我什么时候使用CFRelease?

我写了关联地址的代码。

有这么多的方法。像

我正在分组。

这里是1组

ABAddressBookCreate(); 
ABRecordCopyCompositeName(argument); 
ABRecordCopyValue(argument1, argument2); 
ABRecordCopyValue(argument1, argument2); 
ABMultiValueCopyLabelAtIndex(argument1, argument2); 
ABMultiValueCopyValueAtIndex(argument1, argument2); 

,另外一个就在这里,第2组

CFArrayGetCount(argument); 
CFArrayGetValueAtIndex(argument1, argument2); 
ABMultiValueGetCount(argument); 

我知道有很多其他的方法。

但我不知道什么时候使用CFRelease方法。

我认为第2组的所有方法不做CFRelease

因为包含单词“获取”,没有分配。

,我认为1组的所有方法必须使用CFRelease

,因为有一个字符串“副本”。

我有一本书。

但是有两次使用CFRelease。

一个是释放ABAddressBookCreate()

另一个是ABAddressBookCopyPeopleWithName。

所有其他的东西都不使用CFRelease。

所以我想知道我什么时候使用CFRelease。

请告诉我什么时候使用CFRelease。

回答

9

如果功能名称中包含“复制”或“创建”,然后你自己的对象,所以当你完成你的工作,它必须将其释放。这被称为“创建规则”。有关Core Foundation的内存管理的更多信息,可以参考Memory Management Programming Guide for Core Foundation

+0

嘿,我有同样的问题。我可能以错误的方式发布了一些Core Foundation对象。我想问我如何调试每个对象的保留计数,并确定我可以释放它。 – Sosily 2013-11-19 09:20:44

+1

运行静态分析器并检查每个复制,创建或保留的对象是否正确释放。 – graver 2013-11-19 10:27:38

+0

谢谢你!现在没事了! – Sosily 2013-11-19 11:09:47

3

当您创建Core Foundation对象或成为它的所有者时,您可以拨打CFRelease

看那CFMemory management文档

相关问题