ios 从ABRecordCopyValue声明NSString时的内存泄漏

qyuhtwio  于 2023-04-13  发布在  iOS
关注(0)|答案(3)|浏览(138)

我使用下面的代码行...

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

Xcode上的“analyze”功能说这会导致潜在的内存泄漏。我根本不会释放clientFirstName,因为我既没有alloc也没有retain
然而,我意识到ABRecordCopyValue可能不会像[NSMutableArray arrayWithArray:someArray]这样的命令那样返回一个对象,这可能意味着我确实创建了一个我控制的新对象,并且必须释放。
渴望听到想法...

nwwlzxa7

nwwlzxa71#

任何类型的复制都会返回一个retainCount为1的对象,所以你需要通过CFRelease()release它。
参见文档:
您负责释放此对象。

wfsdck30

wfsdck302#

请参考此链接。它与您的相同:
NSString potential leak
参考KennyTM的回答:
ABMultiValueCopyValueAtIndex是一个“复制”函数,遵循“创建规则”,使用完毕后需要调用CFRelease释放。

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

使用CFRelease释放对象clientFirstName
添加以下代码:

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

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

编辑

正如@Dondragmer在下面的评论中所说:
我想这也能解决问题:

[clientFirstName release];
hpxqektj

hpxqektj3#

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

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

之后

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

相关问题