免费开源的iOS开发学习平台

OC循环结构:2-forin循环

forin循环使用说明

在Objective-C编程中,forin循环可以认为是一种增强型的for循环,这个是Objective-C中的一个重要语法。当遇到遍历数组的情况时经常会使用到forin循环。

例如下方的代码中,创建了一个数组,并且在数组中存储了一些字符串对象。我们可以使用forin循环来遍历数组中的每一个对象,并打印出其存储的文字内容。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 遍历数组array
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@"张三", @"李四", @"王五", @"赵六", nil];
        for (NSString *string in array) {
            NSLog(@"%@", string);
        }
    }
    return 0;
}

运行结果:

对于forin循环来说,我们完全可以使用简单的for循环来替代,例如,我们使用for循环来修改上面的示例代码,同样可以实现相同的功能,但是通过对比我们可以发现,使用forin循环要简便很多。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 遍历数组array
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@"张三", @"李四", @"王五", @"赵六", nil];
        NSInteger count = array.count;
        for (int i = 0; i < count; i++) {
            NSLog(@"%@", array[i]);
        }
    }
    return 0;
}

forin循环使用注意事项

快速枚举的过程中不允许改变容器中的对象,即不允许删除或者增加枚举容器中的对象,因为对于一个既定的枚举器来说,其内部的对象都已经对其进行了枚举排序,如果你私自添加或者删除对象,那么其既定的枚举序列就发生了改变,而这种改变是系统不能识别的,所以Objective-C中不允许这么做。例如,在下面的示例中,在遍历的过程中对数组容器的内容进行了修改,运行时程序就会崩溃,提示的错误原因是:“Collection was mutated while being enumerated”。这个错误是说集合在枚举的过程中发生了突变,执行这样的操作我们会得到未定义的结果。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 遍历数组array
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@"张三", @"李四", @"王五", @"赵六", nil];
        for (NSString *string in array) {
            if ([string isEqualToString:@"张三"]) {
                [array removeObject:string];
            }
        }
    }
    return 0;
}

运行结果:

但有时候我们也必须在快速枚举的过程中删除一些枚举容器中的对象,这时候,我们就需要在删除完一个对象的时候,对循环执行进行break操作。如下:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 遍历数组array
        NSMutableArray *array = [NSMutableArray arrayWithObjects:@"张三", @"李四", @"王五", @"赵六", nil];
        for (NSString *string in array) {
            if ([string isEqualToString:@"张三"]) {
                [array removeObject:string];
                break;
            }
        }
    }
    return 0;
}

示例代码

https://github.com/99ios/2.3.2