在我的应用程序中,静态分析器指出以下代码中的泄漏:
ABMultiValueRef phone = (NSString *)ABRecordCopyValue(person, kABPersonPhoneProperty);
NSString *mobilephone= (NSString*)ABMultiValueCopyValueAtIndex (phone,0);
类似地,每当我使用此函数ABRecordCopyValue时,它指向泄漏
我试图通过[phone release];
方法释放它,但是我收到编译器警告“无效的接收器类型'abmultivalueref'”。发布此内容的正确方法是什么?
答案 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
表示您必须手动释放返回的对象。