潜在的内存泄漏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(…));