2013-05-10 47 views
2

崩潰我有設備中清除地址簿的方法。下面的方法是 。當CFRelease(CFArrayRef)

-(void) clearAdressBook 
{ 
    ABAddressBookRef addrBook=ABAddressBookCreate(); 
    CFArrayRef groups = ABAddressBookCopyArrayOfAllGroups(addrBook); 
    if(groups) 
    { 
     CFIndex numGroups = CFArrayGetCount(groups); 
     for(CFIndex idx=0; idx<numGroups; ++idx) 
     { 
      ABRecordRef groupItem = CFArrayGetValueAtIndex(groups, idx); 

       CFArrayRef people= 
       ABGroupCopyArrayOfAllMembers(groupItem); 
       if(people) 
       { 
        CFIndex peopleCount=CFArrayGetCount(people); 
        for(CFIndex ind=0;ind<peopleCount;++ind) 
        { 
         ABRecordRef person=CFArrayGetValueAtIndex(people, ind); 
         ABAddressBookRemoveRecord(addrBook, person, nil); 
         ABAddressBookSave(addrBook, NULL); 
         CFRelease(person); 
        } 
        CFRelease(people);//CRASH 
       } 

      } 
     } 

    CFRelease(groups); 
} 

當我釋放CFArrayRef應用程序崩潰時,這裏有什麼問題?因爲我知道我必須釋放所有從CF方法返回的名稱包含複製或創建權的反對意見?

+0

嗯。根據[文檔](http://developer.apple.com/library/ios/documentation/AddressBook/Reference/ABGroupRef_iPhoneOS/Reference/reference.html#//apple_ref/c/func/ABGroupCopyArrayOfAllMembers),它表示它返回數組,所以也許它已經autoreleased?如果你不釋放人,你會得到內存泄漏嗎? – 2013-05-10 12:39:46

+0

分析器顯示一切正常,並且沒有內存泄漏。 – taffarel 2013-05-10 12:46:10

回答

4

您可能在這裏過度釋放「人」對象。事實上,人是從數組中檢索出來的,它遵循「獲取規則」,所以你不是它的所有者,你不能釋放它(或者:你可以先保留它,然後釋放它,如果你不確定該對象壽命)。在for循環結束時,當釋放「people」時,數組試圖釋放其內部對象(「人」),這些對象已經過度釋放,並導致崩潰。

因此,嘗試刪除CFRelease(people)語句,或者作爲額外的安全性,在從數組中提取人員(但不要刪除CFRelease(people)指令)後立即添加CFRetain(people)。

+0

我甚至沒有注意到這一點。接得好。 – 2013-05-10 12:46:49

+0

我已經刪除了CFRelease(person);並放回CFRelease(人);現在它工作正常。謝謝。 – taffarel 2013-05-10 12:53:54

+0

我知道這是2年前,但感謝這有幫助的提示。我看不出我的崩潰,直到我看到「過度釋放」是一件事情......我的問題在使用getMatchingServices()後釋放。 – 2016-05-04 05:28:18

相關問題