ABAddressbook崩溃CFStringRef

时间:2014-07-07 19:17:47

标签: ios objective-c abaddressbook

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

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

CRASH LOG:

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)

CODE:

- (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

1 个答案:

答案 0 :(得分:3)

我遇到了同样的错误,问题是:

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

CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

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

nPeople = CFArrayGetCount(allPeople);

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

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