gpt4 book ai didi

iOS 发布 Reference iPhoneContactList with ARC

转载 作者:行者123 更新时间:2023-11-28 22:20:02 26 4
gpt4 key购买 nike

在我的应用程序中,我正在从设备中获取联系人列表,一切都按计划进行,直到我到达发布线。

应用程序根据需要编译,但在运行时它只是停止,将我指向发布行并以绿灯文本告诉错误访问。

这是我的代码:在我自己的队列上使用 GCD 调用的函数(因为这是一个很大的过程,我在后台进行,我不确定是否必须使用 @autoreleasepool

我运行了 product->analyze 并在此函数中添加了一些评论。

-(void)getContacts
{
@autoreleasepool {
ABAddressBookRef iPhoneAddressBook = ABAddressBookCreateWithOptions(NULL, NULL);
__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(iPhoneAddressBook, ^(bool granted, CFErrorRef error)
{
accessGranted = granted;
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else { // we're on iOS 5 or older
accessGranted = YES;
}
if (accessGranted)
{
CFErrorRef error = nil;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); // indirection
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
NSMutableArray* EmailArrayPerPerson = [[NSMutableArray alloc]init];//value stored to EMailArrayPerPerson during its initialization is never read
NSMutableArray* PhoneArrayPerPerson = [[NSMutableArray alloc]init];//value stored to PhoneArrayPerPerson during its initialization is never read
for (int i = 0; i < ABAddressBookGetPersonCount(addressBook); i++)//potential leak of an object stored in to contact
{
NSMutableDictionary *ContactsDetails = [NSMutableDictionary dictionary];
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);
NSString *contact = (__bridge NSString *)(ABRecordCopyCompositeName(ref));
if([contact length] <=0)
continue;
ContactsDetails = [NSMutableDictionary dictionary];
[ContactsDetails setObject:contact forKey:@"CName"];
ABMultiValueRef emails = ABRecordCopyValue(ref, kABPersonEmailProperty);
EmailArrayPerPerson = [[NSMutableArray alloc]init];

NSLog(@"dictionary is:%@",[ContactsDetails objectForKey:@"CName"]);
for (CFIndex j=0; j < ABMultiValueGetCount(emails); j++)
{
NSString* email = (NSString*)CFBridgingRelease(ABMultiValueCopyValueAtIndex(emails, j));
[EmailArrayPerPerson addObject:email];
}
[ContactsDetails setObject:EmailArrayPerPerson forKey:@"CEMails"];//potential leak in emails
ABMultiValueRef multi = ABRecordCopyValue(ref, kABPersonPhoneProperty);
PhoneArrayPerPerson = [[NSMutableArray alloc]init];
for (CFIndex j=0; j < ABMultiValueGetCount(multi); j++)
{
NSString* phone = (NSString*)CFBridgingRelease(ABMultiValueCopyValueAtIndex(multi, j));
[PhoneArrayPerPerson addObject:phone];
}
[ContactsDetails setObject:PhoneArrayPerPerson forKey:@"CPhones"];
[Contacts addObject:ContactsDetails];
CFRelease(ref);//incorect decrement of the reference count of an object that is not owned at this point by the caller.
CFRelease(multi);
}
CFRelease(allPeople);//Potential leak of an object stored in to addressBook
// CFRelease(addressBook);// *strange issue with bad access is here*
}
else
{
CFRelease(iPhoneAddressBook);
return;
}
}
}

我知道这是一个很大的功能,但我想我必须按原样添加它以使一切都清楚。我是 iOS SDK 的新手,所以请您解释一下那里的错误访问是怎么回事?

我不确定,但我认为 addressBook 是多余的分配,因为我已经分配了 iPhoneAddressBook 我不确定。

(我也不确定是否必须发布它(因为我正在使用 ARC ,但是 ARC 不应该为我发布 crefs )).

最佳答案

主要问题似乎出在这里:

ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);
// ...
CFRelease(ref); // <-- WRONG

CFArrayGetValueAtIndex() 的名称中没有“Create”或“Copy”,因此您不要“拥有”返回的对象,也不能释放它。参见 "Ownership Policy"在“Core Foundation 的内存管理编程指南”中获取更多信息。

要解决contact的潜在泄露,替换

NSString *contact = (__bridge NSString *)(ABRecordCopyCompositeName(ref));

通过

NSString *contact = (__bridge_transfer NSString *)(ABRecordCopyCompositeName(ref));

ABRecordCopyCompositeName() 在其名称中包含“复制”,因此您拥有返回的对象。__brigde_transfer 将所有权“转移”给 ARC,因此该对象是当 contact 超出范围时释放。

关于iOS 发布 Reference iPhoneContactList with ARC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20669062/

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