通常情况下,当您尝试访问超出 NSArray
界限之外的索引处的元素时,就会发生这种情况。
假设您有一个这样的 NSArray
:
NSArray *a = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
这段代码会输出 "Array index out of bounds",因为边界是 0 - 2:
@try {
NSString *string = [a objectAtIndex:3];
} @catch(NSRangeException *e) {
NSLog(@"Array index out of bounds");
}
解决这个问题最好的方法是使用快速枚举:
for(id obj in array) {
}
快速枚举使用可枚举对象的NSFastEnumeration
协议实现来为您处理所有繁琐的工作。
即使使用快速枚举,通常也会出现一个问题,就是如果您枚举一个可变结构(例如NSMutableArray
)并在循环体内使用removeObject:
或其变体修改结构,则很快就会遇到此异常,因为结构的长度被缓存,因此即使它越界,它也会继续进行到下一次迭代。
但是,使用快速枚举,您将很快发现此错误,因为内部的__NSFastEnumerationMutationHandler
将捕获它并抛出以下异常:
2011-02-11 00:30:49.825 MutableNSFastEnumerationTest[10547:a0f] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <NSCFArray: 0x10010c960> was mutated while being enumerated.<CFArray 0x10010c960 [0x7fff70c45ee0]>{type = mutable-small, count = 2, values = (
0 : <CFString 0x100001078 [0x7fff70c45ee0]>{contents = "b"}
1 : <CFString 0x100001058 [0x7fff70c45ee0]>{contents = "c"}
)}'
*** Call stack at first throw:
(
0 CoreFoundation 0x00007fff8621e7b4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff80daa0f3 objc_exception_throw + 45
2 CoreFoundation 0x00007fff862765bf __NSFastEnumerationMutationHandler + 303
3 MutableNSFastEnumerationTest 0x0000000100000de7 main + 295
4 MutableNSFastEnumerationTest 0x0000000100000cb8 start + 52
5 ??? 0x0000000000000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException'