1

我正在尝试从联系人中获取姓名和姓氏,并将值存储在几个 NSString 中:

CFStringRef cfName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
self.stName = (NSString *)cfName;
CFRelease(cfName);
CFStringRef cfLastname = ABRecordCopyValue(person, kABPersonLastNameProperty);
self.stLastname = (NSString *)cfLastname;
CFRelease(cfLastname);

问题是,如果联系人中的名字或姓氏为空,当我释放 CFStringRef 时,应用程序会因 EXC_BAD_ACCESS(僵尸?)而崩溃。如果我不释放 CFStringRef 我有泄漏。

任何建议表示赞赏。

最大限度

4

1 回答 1

0

是的,如果您将参数传递给它,CFRelease将会崩溃 ( ) 。haltNULL

sbooth在这里已经提到了这一点。

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

您的(已删除)答案是正确的。代码应如下所示:

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);

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

于 2013-01-21T22:23:31.953 回答