我在下面的代码中尝试从地址簿中获取所有联系人电话号码:
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)'
任何人都有建议为什么会崩溃?谢谢!
答案 0 :(得分:2)
这不是一个问题,取决于iOS5 / iOS6,但是不同测试环境的问题。在一次案例中(我猜一个模拟器)你在地址簿中有联系人,在另一个你没有联系人。
但是for
循环中的测试会因[arrayOfPeople count]
为零而失败,因为count
会返回NSUInteger
,无符号,并将-1
减去0UL
会产生下溢(因为-1
被解释为无符号整数,而是为您提供整数的最大值,因为-1
为负数且无符号整数当然只能存储正整数。
因此,如果您没有任何联系并且[arrayOfPeople count]
为零,那么无论如何都要进入for
循环,因此当您尝试获取空的索引0处的对象时崩溃一群人。
将您的for
循环中的条件替换为
for(index = 0; index<=([arrayOfPeople count]-1); index++)
要
for(index = 0; index<[arrayOfPeople count]; index++)
当您在地址簿中没有任何联系时,当您不会下溢并且无法进入for
循环时,您的崩溃就会消失。