从另一个数组添加对象

时间:2011-12-11 21:18:45

标签: objective-c arrays xcode nsmutablearray

我有以下代码:

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的'

3 个答案:

答案 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中删除对象,因此稍后在数组中的项目索引会被移位。你应该改变你的逻辑来处理这个问题。