我有一个应用程序可以获取用户地址簿中的名字和姓氏。我已经在模拟器和我自己的运行 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 名字,应用程序仍然可以正常工作。
最佳答案
我有同样的错误,问题是:
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/