潜在的内存泄漏 abaddressbookcopyarrayofallpeople( )
Posted
技术标签:
【中文标题】潜在的内存泄漏 abaddressbookcopyarrayofallpeople( )【英文标题】:Potential Memory leak abaddressbookcopyarrayofallpeople( ) 【发布时间】:2013-08-02 06:37:08 【问题描述】:这是保存更改后重新加载我的通讯录的功能,行
self.addressbook=ABAddressbookCreateWithOptions()
和
self.contactAdd=ABAddressBookCopyArrayOfAllPeople(self.addressBook)
显示为潜在的内存泄漏点。
contactAdd 是 CFArr
ayRef 类型,地址簿是 ABAddressBookRef
-(void)reloadAddressBook
// if(self.addressBook)
// CFRelease(self.addressBook);
self.addressBook = ABAddressBookCreateWithOptions(NULL,NULL);
if(ABAddressBookHasUnsavedChanges(self.addressBook))
ABAddressBookSave(self.addressBook,NULL);
// if(self.contactAdd)
// CFRelease(self.contactAdd);
self.contactAdd=ABAddressBookCopyArrayOfAllPeople(self.addressBook);
【问题讨论】:
把你的相关代码放在这里:) 你以后要释放这个对象temp
吗?
在分配时使用_bridge_transfer,因为您分配给CFArray,它是核心基础数组,没有释放或释放数组的方法。要将其降落在保留上,请使用 _bridge 释放目标 C 的土地。
@AshutoshMishra 我给的每个 CFRelease 都显示出潜在的内存泄漏..
@AshutoshMishra:“它是核心基础框架类,所以存在一些漏洞”是过于简单化了。如果您从 CF 或基于 CF 的东西中获取对象,则需要清理它。 CF 不一定意味着泄漏,仅仅因为涉及到 CF 而接受泄漏是草率的编程。
【参考方案1】:
使用另一个变量像这样分配
contactAddtemp=ABAddressBookCopyArrayOfAllPeople(self.addressBook);
self.contactAdd=(__bridge_retained CFArrayRef) CFBridgingRelease(contactAddtemp);
它在 xcode 4.2 中对我有用,但是当我检查它在 4.6 中不起作用时,可能是因为它使用 ABAddressBookCreateWithOptions(NULL,NULL) 而不是 ABAddressBookCreate()
【讨论】:
为什么要调用 CFBridgingRelease 然后立即使用__bridge_retained
进行转换?
它平衡了,但是这样做没有真正的意义,但它似乎在 xcode 4.2 中完成了工作【参考方案2】:
使用 _addressbook 代替 self.addressBook。
【讨论】:
这家伙是个传奇!【参考方案3】:In Core Foundation, Create and Copy functions return an ownership reference.
您需要通过在返回的对象(地址簿、人员数组以及您从此类函数中获得的任何其他内容)上调用 CFRelease
或使用 __bridge_transfer
(或通过调用CFBridgingRelease
):
self.addressBook = CFBridgingRelease(ABAddressBookCreateWithOptions(…));
【讨论】:
以上是关于潜在的内存泄漏 abaddressbookcopyarrayofallpeople( )的主要内容,如果未能解决你的问题,请参考以下文章