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'".发布这个的正确方法是什么?
看起来您将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)