insertObject: atIndex: - 空数组的索引 3 超出范围

Posted

技术标签:

【中文标题】insertObject: atIndex: - 空数组的索引 3 超出范围【英文标题】:insertObject: atIndex: - index 3 beyond bounds for empty array 【发布时间】:2012-10-25 02:22:52 【问题描述】:

我根据字典键创建一个数组:

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 的数组中会导致崩溃?很混乱!

【问题讨论】:

【参考方案1】:

容量只是一个容器类可以容纳多少对象。在索引处插入要求该索引是基于容器中包含的对象总数(而不是可以包含的对象总数)的新对象的有效放置。

如果您的数组的值依赖于索引(这似乎可能是不同的架构或数据结构会更好),那么您可以通过使用 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];
        
    

【讨论】:

NSArrays 的容量甚至不是这样。这只是内存分配的提示;数组可以变得比你传递的容量更大(与 CFArrays 不同)。 好点,NSArray 在达到其容量时会重新分配。感谢您指出@Wevah

以上是关于insertObject: atIndex: - 空数组的索引 3 超出范围的主要内容,如果未能解决你的问题,请参考以下文章

managedContext.insertObject 在 Swift 中调用“atIndex”的额外参数?

NSArrayM insertObject:atIndex:]: 对象不能为 nil

与 insertObject:atIndex 崩溃:对象不能为 nil 但没有数组

[__NSArrayM insertObject:atIndex:]:对象不能为 nil' - 图片

表视图崩溃与'*** - [__NSArrayM insertObject:atIndex:]:对象不能为零'

NSMutableArray insertObject atIndex 问题