2011-03-15 127 views
4

在我的應用程序,靜態分析器點在下面的代碼中的泄漏:釋放ABMultiValueRef對象

ABMultiValueRef phone = (NSString *)ABRecordCopyValue(person, kABPersonPhoneProperty); 
NSString *mobilephone= (NSString*)ABMultiValueCopyValueAtIndex (phone,0); 

同樣每當我使用此功能ABRecordCopyValue它指向一個泄漏

我試圖通過[phone release];方法來釋放它,但是我得到一個編譯器警告「無效的接收器類型」abmultivalueref'「。什麼是正確的方式來釋放這個?

回答

5

看起來你與CF數據類型混淆NS數據類型。地址簿方法通常返回核心基礎(CF)對象。這些對象是免費電話橋接,這意味着它們可以互換使用NS類型一起使用。

當使用核心基礎對象,其名稱中有「複製」任何方法將返回一個對象,你以後需要使用CFRelease釋放。只有當你將它轉換爲它的等效NS您可以使用- release

所以,你的代碼可以寫成以下任一操作:

ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); 
NSString *mobilephone = (NSString *)ABMultiValueCopyValueAtIndex(phone, 0); 

// other code 

[mobilephone release]; 

ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); 
CFStringRef mobilephone = ABMultiValueCopyValueAtIndex(phone, 0); 

// other code 

CFRelease(mobilephone); 
1

您是否嘗試過CFRelease(phone);
因爲ABMultiValueCopyValueAtIndex不是一個的NSString,它是一個CFStringRef

1

使用__bridge_transfer確保ARC會釋放對象適合你。 使用__bridge意味着你必須手動釋放返回的對象。