insertObject:atIndex: - 索引3超出界限为空数组(insertObject:

2019-07-02 14:06发布

我创建一个基于字典的关键是一个数组:

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所指定的数组? 很混乱!

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


文章来源: insertObject: atIndex: - index 3 beyond bounds for empty array