我在使用地址簿将联系人姓名从设备获取到我自己的应用程序中的联系人 View 时遇到了一些问题。
我的代码在模拟器上运行良好,但在 iPhone 4 上测试时它会崩溃,如果有两个或更少的联系人但有 3 个或更多联系人并且应用程序崩溃,应用程序似乎工作正常。
这是我用来将联系人姓名放入数组中的代码。
ABAddressBookRef addressBook;
bool wantToSaveChanges = YES;
bool didSave;
CFErrorRef error = NULL;
addressBook = ABAddressBookCreate();
listOfContacts = [[NSMutableArray alloc]init];
int i;
int len = (int) ABAddressBookGetPersonCount(addressBook);
for(i = 1; i< (len+1); i++){
ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, (ABRecordID) i);
NSString* name = (NSString *)ABRecordCopyCompositeName(person);
ABMultiValueRef number = (NSString *)ABRecordCopyValue(person,kABPersonPhoneProperty);
NSString *mobileNum = (NSString *)ABMultiValueCopyValueAtIndex(number, 0 );
NSLog(@"Name = %@", name);
NSLog(@"Number = %@", mobileNum);
[listOfContacts addObject:name];
[name release];
[mobileNum release];
}
if(ABAddressBookHasUnsavedChanges(addressBook)){
if(wantToSaveChanges){
didSave = ABAddressBookSave(addressBook, &error);
if(!didSave){
//Error
}
}
else{
ABAddressBookRevert(addressBook);
}
}
当它崩溃时,这是在 Xcode 中突出显示的行:
NSString* name = (NSString *)ABRecordCopyCompositeName(person);
错误状态:
Thread 1: Program received signal: "EXC_BAD_ACCESS"
谁能看出可能是什么问题?我不明白为什么它可以在模拟器上运行但不能在设备上运行?还有为什么它适用于最多两个联系人而不是 3 个或更多联系人??
最佳答案
只是一个猜测:
ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, (ABRecordID) i);
这条线对我来说有点可疑。我怀疑记录 ID 的编号是从 1 到什么。特别是如果您删除了条目。
这可以解释为什么它可以在模拟器上运行,我猜你只是添加了一些测试联系人而从未删除过一个。
关于iPhone通讯录问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5792375/