peoplePicker NavigationController泄漏

时间:2013-01-21 22:00:03

标签: iphone ios core-foundation

我正在尝试从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我有泄漏。

任何建议都表示赞赏。

最高

1 个答案:

答案 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

source

因此,您可以检查是否将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);

您仍然可能会收到编译器警告,但此代码应该可以正常工作。