发布ABMultiValueRef对象

时间:2011-03-15 08:10:04

标签: iphone memory-management

在我的应用程序中,静态分析器指出以下代码中的泄漏:

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

类似地,每当我使用此函数ABRecordCopyValue时,它指向泄漏

我试图通过[phone release];方法释放它,但是我收到编译器警告“无效的接收器类型'abmultivalueref'”。发布此内容的正确方法是什么?

3 个答案:

答案 0 :(得分:5)

您似乎将NS数据类型与CF数据类型混淆。地址簿方法通常返回核心基础(CF)对象。这些对象是免费桥接的,这意味着它们可以与NS类型互换使用。

使用核心基础对象时,名称中带有“copy”的任何方法都将返回一个稍后需要使用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 :(得分:1)

你试过CFRelease(phone);吗?
因为ABMultiValueCopyValueAtIndex不是NSString,所以它是CFStringRef

答案 2 :(得分:1)

使用__bridge_transfer可确保ARC为您释放对象。 使用__bridge表示您必须手动释放返回的对象。