Iphone Can';t设置ABPeoplePickerNavigationController的addressBook属性而不会崩溃

Iphone Can';t设置ABPeoplePickerNavigationController的addressBook属性而不会崩溃,iphone,cocoa-touch,Iphone,Cocoa Touch,我想显示一个ABPeoplePicker,其中只包含定义了地理地址的人 因此,我创建了一个地址簿并删除了没有地址的人: addressBook = ABAddressBookCreate(); NSArray *peopleList = (NSArray *)ABAddressBookCopyArrayOfAllPeople( addressBook ); NSLog(@"There are %d people in addressBook", ABAddressBookGetPersonCou

我想显示一个ABPeoplePicker,其中只包含定义了地理地址的人

因此,我创建了一个地址簿并删除了没有地址的人:

addressBook = ABAddressBookCreate();
NSArray *peopleList = (NSArray *)ABAddressBookCopyArrayOfAllPeople( addressBook );
NSLog(@"There are %d people in addressBook", ABAddressBookGetPersonCount(addressBook));
for (id peopleRecord in peopleList) {
  ABMultiValueRef mv = ABRecordCopyValue((ABRecordRef)peopleRecord, kABPersonAddressProperty);
  CFIndex numberOfAddresses = ABMultiValueGetCount(mv);
  if( numberOfAddresses == 0 ) {
    CFErrorRef err;
    ABAddressBookRemoveRecord( addressBook, (ABRecordRef)peopleRecord, &err);
  }
}
[peopleList release];
NSLog(@"There are now %d people in addressBook", ABAddressBookGetPersonCount(addressBook));
ABPeoplePickerNavigationController *peoplePicker = [[ABPeoplePickerNavigationController alloc] init];
NSNumber* addressProp = [NSNumber numberWithInt:kABPersonAddressProperty];
[peoplePicker setAddressBook:addressBook];
peoplePicker.displayedProperties = [NSArray arrayWithObject:addressProp];
[peoplePicker setPeoplePickerDelegate:self];
[self presentModalViewController:peoplePicker animated:YES];
对于信息,在过滤之前我有125条记录,过滤之后我有93条记录

当我显示peoplePicker并在其中滚动时,它会崩溃:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (49) beyond bounds (49)'

知道怎么回事吗?

鉴于NSRangeException的值是49(而不是93到125之间的某个数字),我最初怀疑它与此通讯簿没有直接关系。为
objc\u异常\u抛出添加断点
。这将导致您在出现异常时进入调试器,让您看到是谁实际抛出了它。

它在某个私有类中中断:ABMembersController。因此,我假设删除记录时的地址簿已损坏:如果我对ABAddressBookRemoveRecord行进行注释,它不会崩溃。我自己运行了这段代码,我认为您发现了一个Cocoa错误。我会先用3.0测试这段代码,然后打开雷达。我在iPhone上使用AddressBook的经验是,它还没有完全“煮熟”。我认为他们没有在显示与“真实”地址簿不匹配的地址簿的情况下进行过大量测试。他们似乎在3.0中做了一些繁重的工作,因为他们修复了我们报告的一些bug,然后在以后的beta中重新引入了它们。你可能会创建一个空的通讯簿,然后将你想要的内容添加到其中,看看是否能解决这个问题。我找不到创建空通讯簿的方法。我是不是遗漏了文件中的某些内容;我可能把这里搞糊涂了。我说的“空”是指“把所有东西都拿走”。这有点遥不可及。我怀疑根本的问题在于ABPeoplePickerNavigationController不是设计用来处理未提交的更改的,而ABAddressBook也不是设计用来作为任意人员列表的,只是在提交更改之前进行更改的临时场所。即便如此,我还是会打开雷达。这似乎是一只虫子。我会再次检查3.0版是否有差异。