ABRecordCopyValue导致SIGSEGV崩溃

3
我正在尝试获取如下联系人列表:
CFErrorRef *error = nil;
ABAddressBookRef addressBook = nil;

__block BOOL accessGranted = NO;

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined ||
    ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {

    addressBook = ABAddressBookCreateWithOptions(NULL, error);
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
        accessGranted = granted;
        dispatch_semaphore_signal(sema);
    });
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied ||
         ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted) {
    return nil;
}

if (!accessGranted) {

    if (addressBook) CFRelease(addressBook);
    return nil;
}

CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

if (nPeople <= 0) {
    CFRelease(addressBook);
    return nil;
}

ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook);
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName);

if (!allPeople) return nil;

NSMutableArray *contactsArray = [NSMutableArray arrayWithCapacity:nPeople];

for (CFIndex i = 0; i < nPeople; ++i) {

    ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);

    if (!person) continue;

    ContactData *contact = [ContactData new];
    contact.firstName = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);

在我的 iPhone 5s 和模拟器上运行良好,但构建在测试人员的 iPod 设备上崩溃,并显示 'SIGSEGV' 错误信息:

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

以下是堆栈信息:

3 AppSupport 0x34129a04 CPRecordCopyProperty 4 AppSupport 0x34129a04 CPRecordCopyProperty 5 AddressBook 0x2fd6ad22 ABRecordCopyValueUnfiltered 6 AddressBook 0x2fd6abc6 ABRecordCopyValue

1个回答

4
我有同样的错误,问题是:
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName);

并且

CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

你的应用程序可能给出了不同数量的联系人(因此在你的情况下,nPeople 可能比 allPeople 大,这导致了崩溃)。"source" 似乎没有提供地址簿中的所有联系人。将其更改为 nil 对我有用。另外,为了确保,我会执行:nPeople = CFArrayGetCount(allPeople); Jokinryou Tsui 在这篇文章中非常好地解释了解决方案:ABAddressBookCopyArrayOfAllPeople 和 ABAddressBookGetPersonCount 返回不同的大小 (这是我的第一篇帖子,所以我不确定是否违反了任何规则或遵循了正确的程序。我希望这个答案能帮助到你!)

嘿,Eric,欢迎来到 Stack Overflow。只是想告诉你,你可以使用 `(反引号)来格式化代码,或者使用四个空格缩进。 - William George
感谢@WilliamGeorge! - Mufasa
好的开始!感谢您帮助我解决这个令人不愉快且难以检测的问题! - user2260054

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接