0

这是保存更改后重新加载我的地​​址簿的功能,该行

self.addressbook=ABAddressbookCreateWithOptions()

self.contactAdd=ABAddressBookCopyArrayOfAllPeople(self.addressBook)

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

contactAdd 是 CFAr rayRef 类型,地址簿是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);
    }
4

3 回答 3

2

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

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

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

于 2013-08-02T12:09:58.117 回答
0

使用 _addressbook 代替 self.addressBook。

于 2013-08-05T10:27:15.663 回答
0

在 Core Foundation 中,Create 和 Copy 函数返回所有权引用。

您需要通过调用CFRelease返回的对象(通讯簿、人员数组以及您从此类函数中获得的任何其他内容)或使用__bridge_transfer(或调用CFBridgingRelease)强制转换它来平衡它:

self.addressBook = CFBridgingRelease(ABAddressBookCreateWithOptions(…));
于 2013-08-03T04:31:48.690 回答