今天修改數組里面的無效值時,使用了 for in 循環(huán), 沒想到竟然crash了. 當時我就無措了.代碼如下
for( customModel *model in M_array ){
if ([model.name isEqualToString:@"***"]){
[M_array removeObject:model];
}
}
crash 原因: <_NSArrayM : >was mutated while being enumerated
為什么會造成crash呢?
因為快速遍歷的原理是根據 enumerator對象內部的計數器,調用nextObject方法來實現(xiàn)返回下一個數組元素的. 知道元素全部返回就會返回nil,這就代表著整個enumerator對象就遍歷完成了
#需要注意的是以這種原理來遍歷enumerator對象的話, 無論對這個對象做什么操作, 對象的計數器都不會被重置!
找到的解決方法有以下幾種:
- 1使用for循環(huán)遍歷
for (int i= 0; i < M_array.count;i++){
customModel *model = M_array[i];
if([model.name isEqualToString:@"***"])
{
[M_array removeObject:model];
}
}
- 2如果還想使用for-in 來遍歷的話也是可以的.
NSMutableArray *M_arrayCopy = [M_array mutableCopy];
for( customModel *model in M_arrayCopy ){
if ([model.name isEqualToString:@"***"])
{
[M_array removeObject:model];
}
}
- 3 對數組逆序遍歷,查找對應的元素刪除
NSEnumerator *enumerator = [M_array reverseObjectEnumerator];
for( customModel *model in enumerator ){
if ([model.name isEqualToString:@"***"])
{
[M_array removeObject:model];
}
}
- 4 使用
- (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block;
[M_array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
customModel *model = M_array[idx];
if ([model.name isEqualToString:@"***"]) {
[M_array removeObject:model];
}
}];
如有該文章有什么問題請留言或者私信我.謝謝!
參考:
官方文檔:
https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSEnumerator_Class/index.html
開發(fā)者博客:
http://www.itdecent.cn/p/a634310774a9
http://blog.csdn.net/zhangzhan_zg/article/details/38453305