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]; } } }