廢話少說,開門見山!
遍歷常用的基本上有for 、 for in 、enumerateObjectsUsingBlock,先上代碼:
1、先用for循環(huán)創(chuàng)建一個數(shù)組
NSMutableArray *muArr = [[NSMutableArray alloc] init];
for (int i = 0 ; i < 10; i ++) {
[muArr addObject:[NSString stringWithFormat:@"%d",i]];
}
用for循環(huán)進行遍歷(看起來和上面創(chuàng)建數(shù)組有點相似,但又不同),我們在循環(huán)里加了一個條件,當i==6的時候,在muArr里面加入一個字符串,此時是完全沒問題的
for (int i = 0; i < muArr.count; i ++) {
NSString *content = [muArr objectAtIndex:i];
NSLog(@"%@",content);
if (i == 6) {
[muArr addObject:@"cj"];
}
}
現(xiàn)在我們用for in來進行遍歷,然后根據(jù)條件改變muArr的原有的數(shù)據(jù),此時就會出現(xiàn)崩潰
for (NSString *str in muArr) {
if ([str isEqualToString:@"6"]) {
[muArr addObject:@"Annie"];
}
}
崩潰內(nèi)容如下:
*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x61000004e5e0> was mutated while being enumerated.'
是不是有些納悶,怎么會崩潰呢,看到錯誤信息沒有,這個數(shù)組是個枚舉類型的,就是說,for in 遍歷是快速枚舉,我們不能在這個方法里面對數(shù)組進行增、刪、改。NSArray的枚舉操作中有一條是需要注意:對于可變數(shù)組進行枚舉操作時,不能通過添加或刪除對象等這類操作來改變數(shù)組容器,否則就會報錯。
數(shù)組還有一個系統(tǒng)自帶的方法 enumerateObjectsUsingBlock: 遍歷,代碼如下,這個方法也是簡單的遍歷,不能對數(shù)組容器進行改變的操作
[muArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (idx == 6) {
*stop = YES;
}
}];
順便贈送一個字典的遍歷:
NSDictionary *dic = @{
@"1":@"cj",
@"2":@"annie"
};
[dic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if ([key isEqualToString:@"1"]) {
*stop = YES;
}
}];