发布ABMultiValueRef对象

suj*_*406 4 iphone memory-management

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

ABMultiValueRef phone = (NSString *)ABRecordCopyValue(person,  kABPersonPhoneProperty);
NSString *mobilephone= (NSString*)ABMultiValueCopyValueAtIndex (phone,0);  
Run Code Online (Sandbox Code Playgroud)

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

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

dfr*_*dmn 5

看起来您将NS数据类型与CF数据类型混淆.通讯录方法通常返回核心基础(CF)对象.这些对象是免费桥接的,这意味着它们可以与NS类型互换使用.

使用核心基础对象时,名称中带有"copy"的任何方法都将返回以后需要使用的对象CFRelease.只有当你将它投射到它的NS等效物时才能使用- release.

所以你的代码可以写成以下任何一种:

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

// other code

[mobilephone release];
Run Code Online (Sandbox Code Playgroud)

要么

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

// other code

CFRelease(mobilephone);
Run Code Online (Sandbox Code Playgroud)