2013-08-02 76 views
-1

這是函數保存更改後重新裝入我的地址簿,行潛在的內存泄漏abaddressbookcopyarrayofallpeople()

self.addressbook=ABAddressbookCreateWithOptions() 

self.contactAdd=ABAddressBookCopyArrayOfAllPeople(self.addressBook) 

都表示作爲潛在的內存泄漏點。

contactAdd的類型是恆虛警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); 
    } 
+0

把你的相關代碼在這裏:) – 2013-08-02 06:39:39

+2

你是否稍後發佈這個對象'temp'? –

+0

分配時使用_bridge_transfer,因爲您正在分配給CFArray,該CFArray是核心基礎數組,無法釋放或取消分配數組。爲了將它留在保留地上,釋放目標C的土地使用_bridge。 – iEinstein

回答

0

使用_addressbook而不是self.addressBook。

+0

這個人是一個傳奇完成的工作! – Raon

2

使用另一個變量分配這樣

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

它在Xcode 4.2爲我工作,但是當我檢查它不在4.6中工作可能會導致它使用ABAddressBookCreateWithOptions(NULL,NULL)代替ABAddressBookCreate()

+0

你爲什麼要調用CFBridgingRelease,然後立即用'__bridge_retained'來施放它? –

+0

它平衡了,但是這樣做沒有真正的意義,但它似乎得到了在xcode 4.2 – Gamerlegend