【问题标题】:peoplePickerNavigationController leakspeoplePicker NavigationController 泄漏
【发布时间】:2013-01-21 22:00:03
【问题描述】:

我正在尝试从联系人中获取姓名和姓氏,并将值存储在几个 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 我有泄漏。

欢迎提出任何建议。

最大

【问题讨论】:

标签: iphone ios core-foundation


【解决方案1】:

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

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 传递给它。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2018-07-05
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    相关资源
    最近更新 更多