以下代码:
NSMutableArray *kkk = [NSMutableArray arrayWithCapacity: 20];
[kkk replaceObjectAtIndex:10 withObject: @"cat"];
产生这个
由于未捕获的异常'NSRangeException'而终止应用程序,原因: ' - [NSMutableArray replaceObjectAtIndex:withObject:]:index 10 超出空数组的边界'第一次调用堆栈:
答案 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}}会返回自动释放的数组。