【问题标题】:Adding objects from another array从另一个数组添加对象
【发布时间】:2011-12-11 21:18:45
【问题描述】:

我有以下代码:

for (int i = 1; i <= [nmaSpread count];)
{
    [nmaUserName addObjectsFromArray:[nmaSpread objectAtIndex:i]];
    [nmaSpread removeObjectAtIndex:i];
    i += 2;
}

我已将所有变量声明为全局变量,nmaUserName 和 nmaSpread 都是 NSMutableArrays,并已在 viewDidLoad 中分配。

我想将 nmaSpread 中的所有奇数对象存储到 nmaUsername 中,然后删除 nmaSpread 中的活动对象。

但是它总是因为这个错误而崩溃:

[NSMutableArray addObjectsFromArray:]: 数组参数不是 NSArray 2011-12-11 21:08:55.123 appName[15671:f803] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -[NSMutableArray addObjectsFromArray:]:数组参数不是NSArray'

【问题讨论】:

    标签: objective-c arrays xcode nsmutablearray


    【解决方案1】:

    nmaSpread 本身是一个 NSMutableArray,但看起来它包含的对象不是。当您执行[nmaSpread objectAtIndex:i] 时,将返回来自nmaSpread 的对象。这个对象不是一个数组,所以要添加它,你只需使用addObject:,而不是addObjectsFromArray:

    【讨论】:

      【解决方案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];
      

      【讨论】:

      • 好的,谢谢 :) 我也犯了一个错误,它应该是 i += 1 来制作奇数。
      【解决方案3】:

      NSMutableArray 的 addObjectsFromArray 期望您传递另一个数组,但您传递的是单个对象(索引为“i”的对象)

      你可以试试切换

      [nmaUserName addObjectsFromArray:[nmaSpread objectAtIndex:i]];
      

      [nmaUserName addObject:[nmaSpread objectAtIndex:i]];
      

      这将消除您看到的错误,但是您可能会遇到另一个问题,因为您正在从 nmaSpread 中删除对象,因此数组中稍后项目的索引会发生变化。你可能应该改变你的逻辑来处理这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-03
        • 1970-01-01
        • 2022-11-14
        • 2018-10-04
        • 1970-01-01
        • 2021-08-23
        • 2020-11-30
        • 2022-08-13
        相关资源
        最近更新 更多