我正在开发iOS应用程序。值存储在数组上,但是当我运行应用程序时,它的崩溃数组索引越界。请提前帮助和感谢…
代码:
daysOfWeek = [NSArray arrayWithObjects:@"Monday",@"Tuesday",@"Wednesday",@"Thursday",@"Friday",@"Saturday",@"Sunday", nil];
for (int i = 0; i<= [_daysOfWeek count]; i++) {
_mondayView=[[UIView alloc]initWithFrame:CGRectMake(45, 300 , 830, 30.0)];
[_mondayView setBackgroundColor:[UIColor colorWithRed:190.0/255.0 green:190.0/255.0 blue:194.0/255.0 alpha:1.0]];
[_weeklyView addSubview:_mondayView];
UILabel *daysLabel = [[UILabel alloc]initWithFrame:CGRectMake(65.0f, 300.0f, 120.0f, 30.0f)];
daysLabel.backgroundColor = [UIColor blueColor];
daysLabel.text = [NSString stringWithFormat:@"%@",[_daysOfWeek objectAtIndex:i]];
[_weeklyView addSubview:daysLabel];
}
崩溃日志:
2016-11-14 11:48:41.266 FH Harvey[1839:67640] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 7 beyond bounds [0 .. 6]'
*** First throw call stack:
(
0 CoreFoundation 0x000000011101934b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x000000011065d21e objc_exception_throw + 48
2 CoreFoundation 0x0000000110f53eeb -[__NSArrayI objectAtIndex:] + 155
3 FH Harvey 0x000000010fe1ee62 -[FHWeeklyViewController viewDidLoad] + 1026
4 UIKit 0x00000001115ddc99 -[UIViewController loadViewIfRequired] + 1258
5 UIKit 0x00000001115e4102 -[UIViewController __viewWillAppear:] + 118
6 UIKit 0x000000011160efbf -[UINavigationController _startCustomTransition:] + 1290
7 UIKit 0x000000011161fc34 -[UINavigationController _startDeferredTransitionIfNeeded:] + 697
8 UIKit 0x0000000111620dc7 -[UINavigationController __viewWillLayoutSubviews] + 58
9 UIKit 0x0000000111817d6f -[UILayoutContainerView layoutSubviews] + 223
10 UIKit 0x0000000111500f50 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1237
11 QuartzCore 0x000000010ffbdcc4 -[CALayer layoutSublayers] + 146
12 QuartzCore 0x000000010ffb1788 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
13 QuartzCore 0x000000010ffb1606 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
14 QuartzCore 0x000000010ff3f680 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 280
15 QuartzCore 0x000000010ff6c767 _ZN2CA11Transaction6commitEv + 475
16 UIKit 0x0000000111435a97 _UIApplicationFlushRunLoopCATransactionIfTooLate + 206
17 UIKit 0x0000000111c456e0 __handleEventQueue + 5672
18 CoreFoundation 0x0000000110fbe311 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
19 CoreFoundation 0x0000000110fa359c __CFRunLoopDoSources0 + 556
20 CoreFoundation 0x0000000110fa2a86 __CFRunLoopRun + 918
21 CoreFoundation 0x0000000110fa2494 CFRunLoopRunSpecific + 420
22 GraphicsServices 0x00000001163a0a6f GSEventRunModal + 161
23 UIKit 0x000000011143c964 UIApplicationMain + 159
24 FH Harvey 0x000000010fe221bf main + 111
25 libdyld.dylib 0x000000011491368d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
问题出在for循环上。数组索引从0
开始,因此将for循环更改为:
for (int i = 0; i < [_daysOfWeek count]; i++) {
你正在使用i<=[_daysOfWeek count]
,这就是你得到index 7 beyond bounds [0 .. 6]
崩溃的原因。
代替使用for
循环,你可以使用for each
循环,它很容易实现,它永远不会导致你的索引超出界限崩溃。
for (NSString* str in _daysOfWeek) {
NSLog(@"%@",str);
}
DEEPAK kumar验证一下你的逻辑。你的数组有7个值,你迭代它8次。只需更改逻辑
for (int i = 0; i < [_daysOfWeek count]; i++)
或
使用for each
循环Nirav D描述(最优化的方式)。
快乐编码. .
只需将您的for循环逻辑从i <= [_daysOfWeek count]
更改为i < [_daysOfWeek count]
就可以解决您的问题。但是为了避免以后出现这样的错误,我建议你使用NSArray
的enumerateObjectsUsingBlock
方法。可以通过以下方式完成:
NSArray *daysOfWeek = [NSArray arrayWithObjects:@"Monday",@"Tuesday",@"Wednesday",@"Thursday",@"Friday",@"Saturday",@"Sunday", nil];
[daysOfWeek enumerateObjectsUsingBlock:^(NSString* _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
}];
请写:
for (int i = 0; i < [_daysOfWeek count]; i++)