gpt4 book ai didi

ios - 无法解决CoreFoundation对象中的内存泄漏

转载 作者:行者123 更新时间:2023-12-01 18:59:28 39 4
gpt4 key购买 nike

我使用以下代码删除我已插入到地址簿中的所有联系人,具体取决于它们已添加到的group:

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

NSArray* contactsArray = (__bridge NSArray *)(ABGroupCopyArrayOfAllMembers([self ABGetAddressGroup:addressBook]));

if (contactsArray.count) {

for (NSUInteger index = 0 ; index < contactsArray.count; index++) {

ABRecordRef person = (__bridge ABRecordRef)(contactsArray[index]);

ABAddressBookRemoveRecord(addressBook, person, NULL);
}

CFRelease((__bridge CFTypeRef)contactsArray);

NSArray *groups = (__bridge NSArray *) ABAddressBookCopyArrayOfAllGroups(addressBook);

for (id _group in groups) {

NSString *currentGroupName = (__bridge NSString*) ABRecordCopyValue((__bridge ABRecordRef)(_group), kABGroupNameProperty);

if ([[self getDatabase] isEqualToString:currentGroupName]) {

ABAddressBookRemoveRecord(addressBook, (__bridge ABRecordRef)(_group), NULL);
}

CFRelease((__bridge CFTypeRef)(currentGroupName));
}

CFRelease((__bridge CFTypeRef)(groups));
}

if (ABAddressBookHasUnsavedChanges(addressBook)) {//potential leak of an object stored in contactsArray

//Save recent changes
ABAddressBookSave(addressBook, NULL);

} else {

NSLog(@"Nothing to do here, let's eat cake");
}

CFRelease(addressBook);

分析器在 ABAddressBookHasUnsavedChanges ... potential leak of an object stored in contactsArray中显示警告(如果就是这样)。我需要怎么做才能摆脱这种情况?

如果使用 CFRelease如下:
CFRelease((__bridge CFTypeRef)(contactsArray));

分析器会说: Reference-counted object is used after it is released,即使它在非返回方法的末尾释放,应用也会崩溃。

我在这里做错了什么?我如何摆脱这种内存泄漏?

最佳答案

您的问题在这一行:

CFRelease((__bridge CFTypeRef)contactsArray);

因为执行 if语句的true-branch时,此行仅运行,所以 ,因此在其他所有情况下都不会释放contactsArray。这纯粹是泄漏。

幸运的是,有两种方法可以解决这种简单的问题。

选项#1

将所有权传递给ARC:
NSArray* contactsArray = (__bridge_transfer NSArray *)(ABGroupCopyArrayOfAllMembers([self ABGetAddressGroup:addressBook]));

if (contactsArray.count) {
// (...)

// CFRelease((__bridge CFTypeRef)contactsArray);

// (...)
}

选项#2

确保在任何情况下都释放对象:
NSArray* contactsArray = (__bridge NSArray *)(ABGroupCopyArrayOfAllMembers([self ABGetAddressGroup:addressBook]));

if (contactsArray.count) {
// (...)

// CFRelease((__bridge CFTypeRef)contactsArray);

// (...)
}

if (contactsArray) CFRelease((__bridge CFTypeRef)contactsArray);

我想这样的事情可能对您有帮助。

关于ios - 无法解决CoreFoundation对象中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23760716/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com