潜在的内存泄漏 abaddressbookcopyarrayofallpeople( )

Posted

技术标签:

【中文标题】潜在的内存泄漏 abaddressbookcopyarrayofallpeople( )【英文标题】:Potential Memory leak abaddressbookcopyarrayofallpeople( ) 【发布时间】:2013-08-02 06:37:08 【问题描述】:

这是保存更改后重新加载我的通讯录的功能,行

self.addressbook=ABAddressbookCreateWithOptions()

self.contactAdd=ABAddressBookCopyArrayOfAllPeople(self.addressBook)

显示为潜在的内存泄漏点。

contactAdd 是 CFArrayRef 类型,地址簿是 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( )的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat 停止线程以避免潜在的内存泄漏

潜在的弹簧安全内存泄漏

检测设备信息时的潜在内存泄漏

想知道我是不是有内存泄漏(报告为潜在)

Objective C:switch inside loop - 如何避免(潜在的)内存泄漏

AsyncTask *偶尔*遇到连接超时/错误问题、潜在的内存泄漏或 Android Studio 错误?