首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ABAddressbook crash CFStringRef

ABAddressbook crash CFStringRef
EN

Stack Overflow用户
提问于 2014-07-07 19:17:46
回答 1查看 434关注 0票数 0

我有一个应用程序,让用户的地址簿名和姓。我已经在模拟器和我自己的iPhone 4S上测试过,使用XCode 5运行iOS 7,并且运行良好。

最近,一些国际用户抱怨我的应用程序不断崩溃。幸运的是,我能够从iTunes下载崩溃日志,当我象征它的时候,我发现这个应用程序在下面的步骤中至少在一个用户上崩溃了。我问用户他们的通讯录有什么特别之处,他提到他有一些英文名字,希伯来语。我的问题是为什么它会在那条线上坠毁?是因为CFStringRef是一个敏感的变量,我应该使用其他的东西来代替吗?我无法用我的生命来解决它。

撞车日志:

代码语言:javascript
复制
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)

代码:

代码语言:javascript
复制
- (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的名字,这个应用程序仍然运行良好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-04 19:28:02

我也犯了同样的错误,问题是:

代码语言:javascript
复制
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName);

代码语言:javascript
复制
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

提供不同数量的联系人(因此在您的示例中,nPeople可能比allPeople大,这是造成崩溃的原因)。source似乎并没有给出通讯录中的所有联系人。把它改成nil解决了我的问题。另外,我肯定会:

代码语言:javascript
复制
nPeople = CFArrayGetCount(allPeople);

此解决方案由Jokinryou在本文中解释: ABAddressBookCopyArrayOfAllPeople和ABAddressBookGetPersonCount返回不同大小的

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24618171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档