我正在尝试从Contacts中获取名称和姓氏,并将值存储在几个NSString中:
CFStringRef cfName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
self.stName = (NSString *)cfName;
CFRelease(cfName);
CFStringRef cfLastname = ABRecordCopyValue(person, kABPersonLastNameProperty);
self.stLastname = (NSString *)cfLastname;
CFRelease(cfLastname);
问题是,如果联系人中的firstname或lastname为空,当我发布CFStringRef时,应用程序崩溃了EXC_BAD_ACCESS(僵尸?)。 如果我没有释放CFStringRef我有泄漏。
任何建议都表示赞赏。
最高
答案 0 :(得分:0)
是的,如果您传递CFRelease
参数,halt
将崩溃(NULL
)。
这已经被sbooth here提及了。
CFRelease
看起来像这样:
void CFRelease(CFTypeRef cf) {
if (NULL == cf) HALT; //this line will get you
#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED
if (CF_IS_COLLECTABLE(cf)) {
if (CFTYPE_IS_OBJC(cf)) {
// release the GC-visible reference.
auto_zone_release(auto_zone(), (void*)cf);
} else {
// special-case CF objects for better performance.
_CFRelease(cf);
}
return;
}
#endif
因此,您可以检查是否将NULL
传递给了{<1}}。
你的(已删除)答案中你是对的。代码应如下所示:
CFStringRef cfName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
self.stName = (NSString *)cfName;
if (self.stName) CFRelease(cfName);
CFStringRef cfLastname = ABRecordCopyValue(person, kABPersonLastNameProperty);
self.stLastname = (NSString *)cfLastname;
if (self.stLastname) CFRelease(cfLastname);
您仍然可能会收到编译器警告,但此代码应该可以正常工作。