Cha*_*iya 4 iphone xcode cocoa-touch objective-c ios
for我的代码中有一个循环.当for循环的执行继续时,我的应用程序崩溃并在控制台上打印以下消息:
Terminating app due to uncaught exception 'NSRangeException', reason: '-[NSMutableArray objectAtIndex:] index 2 beyond bounds [0 .. 1]' Call stack at first throw:
Run Code Online (Sandbox Code Playgroud)
使用这个for循环我试图填补一个NSMutableArray但这不是正在做的事情.
Jac*_*kin 14
通常,当您尝试访问索引之外的索引处的元素时会发生这种情况NSArray.
所以说你有NSArray这样的:
NSArray *a = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
Run Code Online (Sandbox Code Playgroud)
此代码将打印"数组索引超出范围",因为边界为0 - 2:
@try {
NSString *string = [a objectAtIndex:3];
} @catch(NSRangeException *e) {
NSLog(@"Array index out of bounds");
}
Run Code Online (Sandbox Code Playgroud)
解决此问题的最佳方法是使用快速枚举:
for(id obj in array) {
//do something with obj
}
Run Code Online (Sandbox Code Playgroud)
快速枚举使用可枚举对象的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'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4062 次 |
| 最近记录: |