0

我已经完成了下面的代码来尝试从通讯录中获取所有联系人的电话号码:

  ABAddressBookRef addressBook = ABAddressBookCreate();
  NSArray *arrayOfPeople = 
  (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);    
  NSUInteger index = 0;
  allContactsPhoneNumber = [[NSMutableArray alloc] init];

  for(index = 0; index<=([arrayOfPeople count]-1); index++){

    ABRecordRef currentPerson = 
    (__bridge ABRecordRef)[arrayOfPeople objectAtIndex:index];

    NSArray *phones = 
    (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(
    ABRecordCopyValue(currentPerson, kABPersonPhoneProperty));

    // Make sure that the selected contact has one phone at least filled in.
    if ([phones count] > 0) {
      // We'll use the first phone number only here.
      // In a real app, it's up to you to play around with the returned values and pick the necessary value.
      [allContactsPhoneNumber addObject:[phones objectAtIndex:0]];
    }
    else{
      [allContactsPhoneNumber addObject:@"No phone number was set."];
    }
  }

但是,它在 iOS 6 中运行良好,但在 iOS 5 中运行良好。它在以下代码中崩溃:

ABRecordRef currentPerson = 
(__bridge ABRecordRef)[arrayOfPeople objectAtIndex:index];

输出打印:

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

任何人都有建议为什么它会崩溃?谢谢!

4

1 回答 1

2

这不是取决于 iOS5/iOS6 的问题,而是不同测试环境的问题。在一种情况下(我猜是一个模拟器)您的通讯录中有联系人,而在另一种情况下则没有。

但是你在你的循环中的测试会在零for的情况下失败,因为返回一个unsigned并且减去创建一个下溢(解释为一个无符号整数给你一个整数的最大值,因为它是负数并且无符号整数当然只能存储正整数)。[arrayOfPeople count]countNSUInteger-10UL-1-1

因此,当您没有任何联系并且[arrayOfPeople count]为零时,无论如何您都会进入for循环,因此在尝试获取空数组中索引 0 处的对象时会崩溃。


替换for循环中的条件

for(index = 0; index<=([arrayOfPeople count]-1); index++)

for(index = 0; index<[arrayOfPeople count]; index++)

for当您的地址簿中没有任何联系人时,您的崩溃应该会消失,因为您不会下溢并且不会进入您的循环。

于 2012-10-11T08:30:45.430 回答