【问题标题】:NSString potential leakNSString 潜在泄漏
【发布时间】:2011-02-07 22:47:46
【问题描述】:

当我在 XCode 上构建和分析我的项目时,我在以下行中收到“警告”:

NSString *contactEmail = (NSString *)ABMultiValueCopyValueAtIndex(emailInfo, 0);

消息是:在线分配的对象可能泄漏......并存储到contactEmail中。

那一行有什么错误吗?

更新

这行代码我得到了同样的“警告”:

ABMultiValueRef emailInfo = ABRecordCopyValue(person, kABPersonEmailProperty);

但是在这里,我不能这样做:

[emailInfo release];

我正在为 iPhone 开发。

【问题讨论】:

    标签: iphone objective-c memory-leaks


    【解决方案1】:

    ABMultiValueCopyValueAtIndex 是一个“复制”功能,跟在the "Create Rule" 之后。使用完毕需要调用CFRelease释放。

    NSString *contactEmail = (NSString *)ABMultiValueCopyValueAtIndex(emailInfo, 0);
    ...
    if (contactEmail != nil)
      CFRelease((CFTypeRef) contactEmail);
    

    【讨论】:

    • 由于对象被用作 NSString,发送释放或自动释放消息给它比检查 nil 更自然,再次将其强制转换并调用 CFRelease()
    • 对象一个NSString
    • @Williham: (1) ABMultiValueCopyValueAtIndex 返回 CoreFoundation 对象,可能是 CFString 或其他东西,例如CF 编号。事实上,在假设结果是字符串之前,OP 应该进行检查,但这种情况很少见。 (2) CFString 可以免费桥接以使用 NSString 方法。 CFString 是 NSString 类簇的一部分,但该类实际上是 NSCFString。 @Jason:我更喜欢将 CF API 用于 CF 的东西,但是你的建议也有效。
    • @KennyTM: (1) 显然,“对象一个NSString,假设它是一个CFString。”。给定一个像emailInfo 这样的名字,这似乎有点可能。 (2) 一个NSCFString 也是一个NSString;并说 CFString can 是免费的桥接使它看起来是可选的。它桥接的。
    • @Vans: CFRelease(emailInfo);
    【解决方案2】:
    1. 演员阵容有点毫无意义。
    2. 线路可能会泄漏,除非您在某处释放或自动释放它。

    编辑:为简洁起见:

    NSString *contactEmail = [(NSString *)ABMultiValueCopyValueAtIndex(emailInfo, 0) autorelease];
    

    (转换可能仍然毫无意义,我不确定编译器将如何处理尝试将消息直接发送到 CFTypeRef。)

    【讨论】:

    • 我已经更新了我的问题。 ABMultiValueRef emailInfo = ABRecordCopyValue(person, kABPersonEmailProperty); 我也有同样的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多