ios - AB地址簿崩溃 CFStringRef

标签 ios objective-c abaddressbook

我有一个应用程序可以获取用户地址簿中的名字和姓氏。我已经在模拟器和我自己的运行 iOS 7 和 XCode 5 的 iPhone 4S 上进行了测试,它运行良好。

最近,一些国际用户一直在提示我的应用程序在他们身上不断崩溃。幸运的是,我能够从 iTunes 下载崩溃日志,当我对其进行符号化时,我发现该应用程序在接下来的步骤中至少有一个用户崩溃了。我问用户他们的地址簿有什么特别之处,他提到他有一些英文、希伯来文的名字。我的问题是为什么它会在那条线上崩溃?是不是 CFStringRef 是一个敏感变量,我应该改用其他变量?我这辈子都弄不明白。

崩溃日志:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x000000005152dca8
Triggered by Thread:  0

Thread 0 Crashed:
0   AppSupport 0x3237642d CPRecordGetProperty + 21
1   AppSupport 0x323765c1 CPRecordCopyProperty + 9
2   AddressBook 0x2e154457 ABRecordCopyValueUnfiltered + 79
3   AddressBook 0x2e1542f7 ABRecordCopyValue + 79
4   Contacts HD 0x0008a583 -[v1AddressBookTblController getValsForTable] (v1AddressBookTblController.m:147)

代码:

- (IBAction) getValsForTable
{

    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

    ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook);
    CFArrayRef allPeopleArray;


    allPeopleArray = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName);


    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

    //NSLog(@"Start LOOP");
    for (int i=0; i<nPeople; i++)
    {
        //NSLog(@"Inside Loop %i", i);

        ABRecordRef ref = CFArrayGetValueAtIndex(allPeopleArray, i);

        //CRASH HAPPENS HERE
        CFStringRef firstNameStr = ABRecordCopyValue(ref, kABPersonFirstNameProperty); 

...

尝试在地址簿中使用非 ASCII 名字,应用程序仍然可以正常工作。

enter image description here

最佳答案

我有同样的错误,问题是:

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

CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

给出了不同数量的联系人(所以在你的情况下 nPeople 可能比 allPeople 大,这会导致崩溃)。 source 似乎没有给出地址簿中的所有联系人。将其更改为 nil 为我解决了这个问题。另外,为了确保我会这样做:

nPeople = CFArrayGetCount(allPeople);

Jokinryou Tsui 在这篇文章中解释了解决方案:ABAddressBookCopyArrayOfAllPeople 和 ABAddressBookGetPersonCount 返回不同的大小

(这是我的第一篇文章,所以我不确定我是否违反了任何规则或遵循了正确的程序。希望答案对您有所帮助!)

关于ios - AB地址簿崩溃 CFStringRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24618171/

相关文章:

objective-c - 如何以编程方式加载 Webview 中的特定 url?

ios - 如何在 Swift 中获取联系人全名

ios - 如何在通讯录联系人中添加工作电话号码?

iphone - 从导航 Controller 中关闭推送的 View

ios - UITableView - 在不同设备上显示不同的图像尺寸

iOS - 50MB 文件,包含 100 万个条目

objective-c - 目前支持的提权方式

ios - 仅在最近没有崩溃时才显示 SKStoreReviewController?

c++ - Objective-C 中带有 C++ header 的包含防护的重复警告

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