【问题标题】:NSMutable ArrayNSM可变数组
【发布时间】:2010-12-12 15:48:28
【问题描述】:

我有一个 NSMutableArray:

NSMutableArray *temp = //get list from somewhere.

现在有一种方法 objectAtIndex 可以返回指定索引处的对象。

我想要做的是,我想首先检查指定索引处的对象是否存在。如果它存在,我想获取该对象。比如:

if ([temp objectAtIndex:2] != nil)
{
     //fetch the object
}

但我在 if 语句中遇到异常,说索引超出范围。

请任何人告诉我如何实现这一目标。

【问题讨论】:

    标签: iphone cocoa cocoa-touch nsmutablearray


    【解决方案1】:

    在 NSArray 中不能有“空”槽。如果 [myArray count]==2 即数组有两个元素,那么您肯定知道在索引 0 处有一个对象,在索引 1 处有一个对象。情况总是如此。

    【讨论】:

    • 继续这个想法,objectAtIndex: 永远不会返回 nil。数组中不能有 nil 对象,请求数组外的东西会引发异常。
    • 我想你可以.. 只需填充 NSNull 对象;)
    • 对不起,-1 相同。正如 Prakash 所说, [NSNull null] 可以占用一个插槽。在“位置”是设计考虑因素的情况下,为丢失的对象设置一个“空占位符”有时很重要。
    • [NSNull null] 是一个对象的实例,您当然可以根据需要添加到数组中,就像您可以添加任何对象一样。如果我愿意,我可以用 14 兆像素 NSImage 实例填充阵列的 1000,000 个插槽并将其称为“空”。如果您尝试访问超出数组边界的索引,您将永远无法取回 NSNull 的实例。你会得到一个例外。
    【解决方案2】:

    首先使用计数方法检查长度。

    if ([temp count] > indexIWantToFetch)
        id object = [temp objectAtIndex:indexIWantToFetch];
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      初始化时,请执行以下操作:

      NSMutableArray *YourObjectArray = [[NSMutableArray alloc] init];
      for(int index = 0; index < desiredLength; index++)
      {
         [YourObjectArray addObject:[NSNull null]];
      }
      

      然后当你想添加但检查它是否已经存在时,做这样的事情:

      YourObject *object = [YourObjectArray objectAtIndex:index];
      if ((NSNull *) object == [NSNull null]) 
      {
          /// TODO get your object here..
      
          [YourObjectArray replaceObjectAtIndex:index withObject:object];
      }
      

      【讨论】:

      • 可以这样做,但你到底为什么要这样做呢?
      • 在很多情况下,“空占位符”在数组中很有用。 Prakash 说可以将 [NSNull null] 添加到数组中是正确的。在我必须解决的一种情况下,与位置相关的数值数组可能有“缺失值”。 “缺失值”与 [NSNumber numberWithInt:0] 不同 ...
      【解决方案4】:

      只需检查索引是否 >= 0 并且

      返回当前在接收器中的对象数。

      - (NSUInteger)count
      
      int arrayEntryCount = [temp count];
      

      【讨论】:

        【解决方案5】:

        首先检查数组的长度-

        NSMutableArray *temp = //从某处获取列表。

        现在检查- 如果(临时长度) {

        你的对象类 *obj = [temp objectAtIndex:indexnumber];

        // indexnumber 是 0,1,2 ,3 或任何...

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-20
          • 2013-05-16
          • 1970-01-01
          相关资源
          最近更新 更多