潜在的内存泄漏abaddressbookcopyarrayofallpeople()

这是保存更改后重新加载我的地​​址簿的function

self.addressbook=ABAddressbookCreateWithOptions() 

 self.contactAdd=ABAddressBookCopyArrayOfAllPeople(self.addressBook) 

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

contactAdd的types是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); } 

使用_addressbook而不是self.addressBook。

使用另一个variables像这样分配

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

它在xcode 4.2中为我工作,但是当我检查它不工作在4.6可能会导致它使用ABAddressBookCreateWithOptions(NULL,NULL),而不是ABAddressBookCreate()

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

你需要通过在返回的对象(地址簿,人员数组,以及从这些函数获得的任何东西)上调用CFRelease来平衡这一点,或者通过使用__bridge_transfer (或通过调用CFBridgingRelease )来CFBridgingRelease

 self.addressBook = CFBridgingRelease(ABAddressBookCreateWithOptions(…));