我有以下代码:
for (int i = 1; i <= [nmaSpread count];)
{
[nmaUserName addObjectsFromArray:[nmaSpread objectAtIndex:i]];
[nmaSpread removeObjectAtIndex:i];
i += 2;
}
我已将所有变量声明为global,nmaUserName和nmaSpread都是NSMutableArrays,并已在viewDidLoad中分配。
我想将nmaSpread中的所有奇数对象存储到nmaUsername中,然后在nmaSpread中删除活动对象。
然而,它一直在崩溃:
[NSMutableArray addObjectsFromArray:]:数组参数不是NSArray 2011-12-11 21:08:55.123 appName [15671:f803] *由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* - [NSMutableArray addObjectsFromArray:]:数组参数不是NSArray的'
答案 0 :(得分:3)
nmaSpread
本身是一个NSMutableArray,但看起来它包含的对象不是。执行[nmaSpread objectAtIndex:i]
时,会从nmaSpread
返回一个对象。此对象不是数组,因此要添加它,您只需使用addObject:
,而不是addObjectsFromArray:
。
答案 1 :(得分:2)
您的代码存在一些问题。
首先,你错过了-addObjectsFromArray:
的所作所为。您想要的实际方法只是addObject:
。
其次,在循环中修改数组是危险的。 Apple的官方消息是“这可能在某些情况下有效,但不要这样做,因为它可能会在未来的任何时候停止工作”。您需要等到完成数组循环后再删除它们。你当前的代码肯定做错了。
你可以用笔/纸坐下来计算数学以保持完整,但这样做更容易,更安全:
NSMutableIndexSet *indexesToRemove = [NSMutableIndexSet indexSet];
for (int i = 1; i <= [nmaSpread count];)
{
[nmaUserName addObject:[nmaSpread objectAtIndex:i]];
[indexesToRemove addIndex:i];
i += 2;
}
[mmaSpread removeObjectsAtIndexes:indexesToRemove];
答案 2 :(得分:1)
NSMutableArray的addObjectsFromArray希望你传递另一个数组,但是你传递的是一个对象(索引为'i'的那个)
您可以尝试切换
[nmaUserName addObjectsFromArray:[nmaSpread objectAtIndex:i]];
到
[nmaUserName addObject:[nmaSpread objectAtIndex:i]];
这将删除您看到的错误,但随后您可能会遇到另一个问题,因为您正在从nmaSpread中删除对象,因此稍后在数组中的项目索引会被移位。你应该改变你的逻辑来处理这个问题。