0

我正在使用以下代码行...

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

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

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

渴望听到想法...

4

3 回答 3

3

任何类型的副本都会返回一个 aretainCount为 1 的对象,因此您需要release通过CFRelease().

请参阅文档

您有责任释放此对象。

于 2012-04-15T14:03:46.307 回答
1

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

NSString 潜在泄漏

参考KennyTM的回答:

ABMultiValueCopyValueAtIndex是一个“复制”功能,它遵循 “创建规则”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];

应该解决问题。

如果您需要更多帮助,请告诉我。

希望这对您有所帮助。

于 2012-04-15T14:23:42.227 回答
0

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

前:

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

NSString *firstName = (__bridge_transfer NSString*) ABRecordCopyValue(person, kABPersonFirstNameProperty);
于 2015-04-08T12:29:32.247 回答