【问题标题】:Difference between two ways of Iteration in Objective C?Objective C中两种迭代方式的区别?
【发布时间】:2012-02-27 10:22:08
【问题描述】:

我对两种迭代方式有一些问题。

NSArray *array=[[NSArray alloc] initWithObjects:@"A",@"B",@"C",@"D",nil];

NSMutableArray *mutArray=[[NSMutableArray alloc] initWithArray:array];

当我这样做时,它工作正常

for (int i=0;[mutArray count]!=0;) {
    [mutArray removeObjectAtIndex:i];
}
NSLog(@"%d,",[mutArray count]);

但是当我这样做的时候,它就崩溃了……为什么?

for(id obj in mutArray)
{
    [mutArray removeObject:obj]
}
NSLog(@"%d,",[mutArray count]);

请给我第二种情况的解决方案。

【问题讨论】:

  • 嘿,看看这篇文章:stackoverflow.com/questions/5826336/… - 为什么你不能使用快速 for 循环从数组中删除项目。
  • @joerick 的答案很准确,但仅供参考:[mutArray removeAllObjects]; ;)

标签: iphone ios ios5 xcode4.2


【解决方案1】:

第二种情况称为快速枚举。由于快速枚举的实现细节,您无法在快速枚举数组时对其进行编辑。

我经常通过以下方式解决这个问题:

for(id obj in [[mutArray copy] autorelease])
{
    [mutArray removeObject:obj]
}
NSLog(@"%d,",[mutArray count]);

这样,您正在对数组的临时副本进行迭代,但您可以在执行过程中修改原始副本。

附言您不能在快速枚举期间进行编辑,因为快速枚举通过在枚举开始时向对象询问内容的 C 数组来工作。一旦获得,迭代很快,因为在枚举之间没有 Objective-C 消息调用。但是,如果修改数组,C 数组将不再是内容的有效表示,因此会引发异常。

【讨论】:

    【解决方案2】:

    您不能在快速枚举集合时对其进行变异。

    快速枚举的工作原理是从集合中请求一组元素。它这样做是为了性能和正确性。由于您正在枚举一片元素,因此程序不需要一直往返于容器。但是,如果您在枚举器背后改变集合,那么所有正确性和对象生命周期的保证都将丢失。

    在这种情况下,您会在控制台中看到一个错误。

    另请参阅:-removeAllObjects

    【讨论】:

    【解决方案3】:

    我的建议:

    NSMutableArray *temps = [NSMutableArray array];
    for(id obj in mutArray)
    {
        // checking condition here
        [temps addObject:obj];
    }
    [mutArray removeObjectsInArray:temps];
    

    【讨论】:

      【解决方案4】:

      改变集合会使枚举器无效。枚举器“检测”到更改并触发错误。在快速枚举中,您可以标记需要删除的内容或在第一个位置使用索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-15
        • 2017-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多