代码之家  ›  专栏  ›  技术社区  ›  Ben Packard Ross Knipe

从nsmutableArray中删除对象

  •  15
  • Ben Packard Ross Knipe  · 技术社区  · 16 年前

    在设置for循环时,我无意中发现了以下快捷方式(与我一直使用的教科书示例相比,这是一种快捷方式):

    for (Item *i in items){ ... }
    

    与长格式相反:

    for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right
    

    如果我使用的是较短的版本,是否有方法删除当前正在迭代的项(即“i”)?还是需要使用较长的格式?

    5 回复  |  直到 11 年前
        1
  •  31
  •   Beltalowda    15 年前

    同时不能从数组中移除对象 fast-enumerating 它:

    数字是安全枚举器 有一个突变保护装置,如果你 尝试修改集合 枚举期间,异常为 提高。

    不管怎样,为什么在枚举容器时需要更改它?考虑存储需要删除的元素,并使用 removeObjectsInArray: 或 removeObjectsAtIndexes: 方法。

        2
  •  9
  •   Awais Qarni Leonardo Conde    15 年前

    只需添加关键字 break; 删除项目后…

    for(id item in items) {
        if([item isEqual:itemToDelete]) {
            [items removeObject:item];
            break;
        }
    }
    
        3
  •  3
  •   sergii    11 年前

    枚举期间不能修改Objective-C集合。

    可以使用此变量从集合中删除对象:

    for (NSInteger i = items.count - 1; i >= 0 ; i--) {
       [items removeObjectAtIndex:i];
    }
    
        4
  •  1
  •   BergmannF    16 年前

    前一个循环是目标C中的“for each”循环。

    *i是指向items数组中直接项的指针(大多数情况下这将是nsmutablearray)。

    这样您就可以直接对项目进行操作:

    [items removeObject: i];
    

    这(应该)有效-我目前没有在我的Mac上工作,无法检查它。 但是,Objective-C可能会防止在迭代集合时删除对象(这在大多数语言中很常见)。

        5
  •  0
  •   Kristijan Iliev Gaurav Karia    11 年前

    我将此代码用于:

    for (NSUInteger i = [items count] - 1; ; i--) {
         [items removeObjectAtIndex:i];
    }