insertObject:atIndex: – 索引3超出空数组的边界
我创build一个基于字典键的数组:
factsBuiltArray = [NSMutableArray arrayWithCapacity: 6]; if ([statusDict count] == 10) { for (NSString *key in [statusDict allKeys]) { if ([key isEqualToString: @"currenciesAndConversions"]) { [factsBuiltArray insertObject:key atIndex: 0]; } else if ([key isEqualToString: @"languageAndTranslations"]) { [factsBuiltArray insertObject:key atIndex: 1]; } else if ([key isEqualToString: @"plugSize"]) { [factsBuiltArray insertObject:key atIndex: 2]; } else if ([key isEqualToString: @"timezone"]) { [factsBuiltArray insertObject:key atIndex: 3]; // crashes over here } else if ([key isEqualToString: @"population"]) { [factsBuiltArray insertObject:key atIndex: 4]; } else if ([key isEqualToString: @"wikipedia"]) { [factsBuiltArray insertObject:key atIndex: 5]; } } }
崩溃日志是:
*** -[__NSArrayM insertObject:atIndex:]: index 3 beyond bounds for empty array
为什么插入一个对象到一个容量为6的数组使其崩溃? 很混乱!
容量仅仅是容器类可容纳多less个对象。 在索引处插入要求索引是基于容器中包含的对象总数(而不是可以包含的对象总数)的新对象的有效位置。
如果你的数组的值是索引相关的(这可能是一个不同的架构或数据结构可能会更好),那么你可以确保每个索引都填满了NSNulls数组。 这将需要你从数组中读取时检查NSNulls,虽然这可能是额外的工作,所以这可能不是最好的方法。 在任何情况下,您都可以将您的代码更改为以下内容来修复崩溃。
factsBuiltArray = [NSMutableArray arrayWithCapacity: 6]; for (NSUInter i = 0; i < 6; i++) { [factsBuiltArray addObject:[NSNull null]]; } if ([statusDict count] == 10) { for (NSString *key in [statusDict allKeys]) { if ([key isEqualToString: @"currenciesAndConversions"]) { [factsBuiltArray replaceObjectAtIndex:0 withObject:key]; } else if ([key isEqualToString: @"languageAndTranslations"]) { [factsBuiltArray replaceObjectAtIndex:1 withObject:key]; } else if ([key isEqualToString: @"plugSize"]) { [factsBuiltArray replaceObjectAtIndex:2 withObject:key]; } else if ([key isEqualToString: @"timezone"]) { [factsBuiltArray replaceObjectAtIndex:3 withObject:key]; } else if ([key isEqualToString: @"population"]) { [factsBuiltArray replaceObjectAtIndex:4 withObject:key]; } else if ([key isEqualToString: @"wikipedia"]) { [factsBuiltArray replaceObjectAtIndex:5 withObject:key]; } } }
- Swift 4:Timer Crashing – 无法识别的选择器发送到实例
- 使用scrollViewWillEndDragging自定义UIScrollView分页
- 使用UIPinchGestureRecognizer以缩放方向缩放视图
- 自定义iOS键盘中的快速键入build议
- Swift – 为单身人士设置代表
- UITableView中的dynamicUIImageView大小
- 如何在设备上的前台应用程序中显示双高度绿色状态栏(In-Call)?
- SpringWithDamping为CALayeranimation?
- 如果使用CoreMotion / Accelerometer删除iPhone,则以编程方式进行检测