【问题标题】:how do I get the index at which an Object has been added to an NSMutableArray?如何获取将对象添加到 NSMutableArray 的索引?
【发布时间】:2012-04-19 15:08:24
【问题描述】:

我正在向 NSMutableArray 添加一个对象,如下所示:

[array addObject:myObject];

我现在想向我的数组索引的代表发送一个引用,这个对象被添加到其中。 有没有一种简单的方法可以找出我的对象在数组中添加的索引,以便稍后我可以调用

[array objectAtIndex:index] 

要获得它的参考吗?

谢谢!

【问题讨论】:

  • 在添加对象时,您还可以提供索引 [array addObject:myObject atIndex:index];
  • @SreeCharan 在NSMutableArray 中没有这种方法addObject:atIndex:。你的意思是-insertObject:atIndex:
  • 是的,对不起,它的 insertObject: atIndex:

标签: iphone cocoa-touch ios4


【解决方案1】:

与其将对象的索引(可能不正确)传递给您的委托,不如传递对对象本身的引用。如果委托需要数组中对象的索引,它可以使用-indexOfObject: 自行计算,正如 Antonio MG 所描述的那样。可变数组中任何给定对象的索引可以随着对象的添加、插入和删除而改变。指望索引在任何时间段内都保持有效就像在柜台上放一个果冻三明治一样——它肯定会吸引虫子。

【讨论】:

    【解决方案2】:

    您需要序列化对可变数组的访问,并且-addObject: 总是将对象添加到数组的末尾。鉴于这两个断言,您知道下一个添加对象的索引将始终是数组的当前长度。所以以下情况成立:

    NSUInteger nextIndex = [array count];
    [array addObject:myObject];
    // you can now tell your delegates that nextIndex is the index of myObject
    

    【讨论】:

    • 是的.. 但如果我这样做:{ [array addObject:obj1]; [数组添加对象:obj2]; [数组删除对象:obj1]; [array addObject:obj3]} obj3 的索引有时会是 0 而不是 1 吗?
    • @Fervus 是的,你是对的——指数发生了变化。不要使用可变数组中对象的索引来引用该对象;改为使用对对象本身的引用。
    • @Fervus 您需要先记录每个索引,或者从当前计数开始,然后知道将对象添加到/删除对象的顺序。这就是为什么需要序列化对可变数组的访问的原因。如果您要大量移动阵列,那么您应该找到另一种方法来跟踪对象位置。
    【解决方案3】:

    使用此方法:

    index = [animalOptions indexOfObject:myObject];
    

    【讨论】:

    • 当您已经知道-addObject: 要将新对象放置在哪个索引处时,这可能需要遍历整个数组。仅当您不打算传达索引并且您知道您的数组将相对较小并且您的对象的 -equalTo:-hash 方法是正确的时,这才会有用。
    • @JasonCoco 从添加对象和想知道它的索引之间可能会发生什么的问题并不完全清楚。后者可能直接发生在前者之后,在这种情况下,使用数组的 count 可以工作(并且感谢您至少说明了一些约束 w.r.t.),但又可能不会。使用 -indexOfObject: 是对 OP 问题的最一般、最正确的直接答案。另外,记住NSArraydoesn't always behave the way you'd expect,所以这里的方法可能还不错。
    • @Caleb 是的,我意识到在 OP 发表另一条评论之后。但是,如果是这种情况,OP 应该考虑一种更好的方法来跟踪这些对象(可能使用索引集并将对象留在数组中,或者,如果它们非常大,将它们交换为 NSNull 实例并删除它们的索引来自索引集)。我知道数组可能并不总是按照我们预期的方式运行,但我们会为最坏的情况做好准备(目前数组实现实际上确实以这种方式运行,直到它变得非常非常大)
    【解决方案4】:

    最新添加的对象应位于[array count] - 1 索引处。您始终可以依靠“count - 1”方案来确定最后一个索引。

    【讨论】:

      【解决方案5】:

      如果你调用 addObject 你总是在最后添加对象(所以计数 - 1)。 您可以使用“insertObject:atIndex:”来指定索引。 对于您的问题:indexOfObject:

      【讨论】:

        【解决方案6】:

        添加对象的索引后直接是array.count -1

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 1970-01-01
          • 2011-07-05
          • 2012-01-25
          相关资源
          最近更新 更多