从ABRecordCopyValue声明NSString时内存泄漏

时间:2012-04-15 13:59:34

标签: iphone objective-c ios memory-leaks abaddressbook

我使用以下代码行...

NSString *clientFirstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);

Xcode上的“分析”功能表明这会导致潜在的内存泄漏。我根本没有发布clientFirstName,因为我没有allocretain'。

但是,我意识到ABRecordCopyValue可能没有返回对象,因为像[NSMutableArray arrayWithArray:someArray]这样的命令可能意味着我确实创建了一个我控制并且必须释放的新对象。

热衷于听到想法......

3 个答案:

答案 0 :(得分:3)

任何类型的副本都会返回retainCount为1的对象,因此您需要release通过CFRelease()。{/ p>

请参阅doc

  

您有责任释放此物品。

答案 1 :(得分:1)

请参阅此链接。它和你的一样:

NSString potential leak

请参阅 KennyTM

的回答
  

ABMultiValueCopyValueAtIndex是一个“复制”功能,紧随其后   the "Create Rule"。   完成使用后,您需要致电CFRelease以释放它。

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

使用clientFirstName释放您的对象CFRelease

添加以下代码:

if(clientFirstName != nil)
{
     CFRelease((CFTypeRef) clientFirstName);
}

注意:不要忘记检查clientFirstName是否为零。最好在执行任何函数之前检查对象不是nil,因为它可以避免潜在的崩溃,但不是在这种情况下,但在很多情况下

修改

同样@Dondragmer在下面的评论中说:

我甚至认为

[clientFirstName release];

应该解决问题。

如果您需要更多帮助,请与我联系。

希望这会对你有所帮助。

答案 2 :(得分:0)

我不完全理解ObjectiveC引用计数的工作原理,但代码中的一个小更新修复了Analyze警告:

在:

NSString *firstName = (__bridge NSString*) ABRecordCopyValue(person, kABPersonFirstNameProperty);

NSString *firstName = (__bridge_transfer NSString*) ABRecordCopyValue(person, kABPersonFirstNameProperty);