潜在的内存泄漏abaddressbookcopyarrayofallpeople()

时间:2013-08-02 06:37:09

标签: ios xcode addressbookui

这是保存更改后重新加载地址簿的功能

self.addressbook=ABAddressbookCreateWithOptions()

self.contactAdd=ABAddressBookCopyArrayOfAllPeople(self.addressBook)

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

contactAdd的类型为CFAr r 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);
    }

3 个答案:

答案 0 :(得分:2)

使用另一个变量来像这样分配

contactAddtemp=ABAddressBookCopyArrayOfAllPeople(self.addressBook); 
self.contactAdd=(__bridge_retained CFArrayRef) CFBridgingRelease(contactAddtemp); 

它在xcode 4.2中对我有用,但是当我检查它在4.6中不起作用可能是因为它使用ABAddressBookCreateWithOptions(NULL,NULL)而不是ABAddressBookCreate()

答案 1 :(得分:0)

In Core Foundation, Create and Copy functions return an ownership reference.

您需要通过在返回的对象(通讯簿,人员数组以及您从此类函数中获得的任何其他内容)上调用CFRelease来平衡它,或者通过使用{{1 (或通过调用__bridge_transfer):

CFBridgingRelease

答案 2 :(得分:0)

使用_addressbook而不是self.addressBook。