NSString潜在泄漏

Van*_*nel 3 iphone memory-leaks objective-c

当我在XCode上构建和分析我的项目时,我在以下行获得了"警告":

NSString *contactEmail = (NSString *)ABMultiValueCopyValueAtIndex(emailInfo, 0);
Run Code Online (Sandbox Code Playgroud)

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

那条线上有错误吗?

UPDATE

我用这行代码得到了相同的'警告':

ABMultiValueRef emailInfo = ABRecordCopyValue(person, kABPersonEmailProperty);
Run Code Online (Sandbox Code Playgroud)

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

[emailInfo release];
Run Code Online (Sandbox Code Playgroud)

我正在为iPhone开发.

ken*_*ytm 7

ABMultiValueCopyValueAtIndex是一个"复制"功能,它遵循"创建规则".CFRelease完成使用后,您需要调用以释放它.

NSString *contactEmail = (NSString *)ABMultiValueCopyValueAtIndex(emailInfo, 0);
...
if (contactEmail != nil)
  CFRelease((CFTypeRef) contactEmail);
Run Code Online (Sandbox Code Playgroud)

  • @Williham:(1)`ABMultiValueCopyValueAtIndex`返回CoreFoundation对象,可能是CFString,或其他东西,例如CFNumber.事实上OP应该在假设结果是一个字符串之前检查,但这是罕见的情况.(2)CFString可以免费桥接以使用NSString方法.CFString是NSString的类集群的一部分,但该类实际上是NSCFString.@Jason:我更喜欢将CF API用于CF的东西,但是你的建议也适用. (2认同)
  • @KennyTM:(1)显然,"对象*是一个`NSString`,假设它是一个`CFString`.".鉴于像`emailInfo`这样的名字,这似乎有点可能.(2)`NSCFString`也是一个`NSString`; 并说CFString*可以*免费使用,这使得它看起来是可选的.它*被*桥接. (2认同)