replaceObjectAtIndex错误?

时间:2011-07-14 04:41:01

标签: objective-c cocoa-touch

以下代码:

NSMutableArray *kkk = [NSMutableArray arrayWithCapacity: 20];
[kkk replaceObjectAtIndex:10 withObject: @"cat"];

产生这个

  

由于未捕获的异常'NSRangeException'而终止应用程序,原因:   ' - [NSMutableArray replaceObjectAtIndex:withObject:]:index 10   超出空数组的边界'第一次调用堆栈:

2 个答案:

答案 0 :(得分:7)

arrayWithCapacity:分配所需的内存,但不会用对象填充数组。 nil不是填充数组的有效对象。因此,如果你需要一个包含空对象的数组,你将不得不做这样的事情,

int size = 20;
NSMutableArray *kkk = [NSMutableArray arrayWithCapacity:size];
for ( int i = 0; i < size; i++ ) {
    [kkk addObject:[NSNull null]];
}

现在您可以安全地替换对象,

[kkk replaceObjectAtIndex:10 withObject: @"cat"];

答案 1 :(得分:2)

获取具有该容量的数组不会填充元素;当你尝试替换索引10处的对象时,它仍然是一个空数组。如果你提供更多关于这种情况发生的上下文的详细信息,我可以尝试解决问题。

编辑:如果您必须立即拥有包含对象的数组,请尝试以下操作:

NSMutableArray *kkk = [NSMutableArray arraywithObjects: @"", @"", @"", @"", nil];

除了20个@""而不是4个。然后你得到一个20个字符串的数组。但是,如果您在直接范围之外使用retain,请务必将arrayWithObjects放在其末尾,因为{{1}}会返回自动释放的数组。