我有一个应用程序,让用户的地址簿名和姓。我已经在模拟器和我自己的iPhone 4S上测试过,使用XCode 5运行iOS 7,并且运行良好。
最近,一些国际用户抱怨我的应用程序不断崩溃。幸运的是,我能够从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的名字,这个应用程序仍然运行良好。

发布于 2014-08-04 19:28:02
我也犯了同样的错误,问题是:
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName);和
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);提供不同数量的联系人(因此在您的示例中,nPeople可能比allPeople大,这是造成崩溃的原因)。source似乎并没有给出通讯录中的所有联系人。把它改成nil解决了我的问题。另外,我肯定会:
nPeople = CFArrayGetCount(allPeople);此解决方案由Jokinryou在本文中解释: ABAddressBookCopyArrayOfAllPeople和ABAddressBookGetPersonCount返回不同大小的
(这是我的第一篇帖子,所以我不确定我是否违反了任何规则或遵循了正确的程序。我希望答案有帮助!)
https://stackoverflow.com/questions/24618171
复制相似问题