遍历数组时移除数组中元素造成程序崩
2016-04-07 15:21
405 查看
今天对项目中的一个功能进行改进时,出现了程序崩溃,后来定位到bug所在处,经过一番研究,解决了。直接贴代码,如下。
错误日志:Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x7fc7f162c1d0> was mutated while being enumerated.'
#import "ViewController.h"
@interface
ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
//[self testError]; //错误
//[self testSolve1]; //解决方法1
//[self testSolve2]; //解决方法2
}
- (void)testError {
NSMutableArray *array = [NSMutableArrayarrayWithObjects:@1,@2,@3,@4,@5,@6,nil];
for (NSNumber *numin array) {
if ([num isEqualToNumber:@4]) {
NSLog(@"删除数组中的数字4");
[array removeObject:num];
}
}
//用for循环去遍历一个数组,然后删除该数组中的一些元素的操作,就会出现程序崩溃的情况。因为一个数组不能同时有一个线程去读取,然后另一个线程去写,所以出错
}
//解决方法1:定义一个一模一样的临时数组,遍历临时数组然后操作原数组
- (void)testSolve1 {
NSMutableArray *array = [NSMutableArrayarrayWithObjects:@1,@2,@3,@4,@5,@6,nil];
NSMutableArray *tempArray = [NSMutableArrayarrayWithArray:array];
for (NSNumber *numin tempArray) {
if ([num isEqualToNumber:@4]) {
NSLog(@"删除数组中的数字4");
[array removeObject:num];
}
}
NSRange range =
NSMakeRange(0, [array
count]);
NSArray *subArray = [array
subarrayWithRange:range];
NSLog(@"打印所有元素:%@",subArray);
}
//解决方法2:利用block来操作,原理:找到符合的条件之后,暂停遍历,然后修改数组的内容
- (void)testSolve2 {
NSMutableArray *array = [NSMutableArrayarrayWithObjects:@1,@2,@3,@4,@5,@6,nil];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj,
NSUInteger idx,BOOL *
_Nonnull stop) {
if ([obj isEqualToValue:@4]) {
*stop = YES;
}
if (*stop) {
[array removeObject:obj];
NSLog(@"打印数组所有元素:%@",array);
}
}];
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
//解决
错误日志:Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x7fc7f162c1d0> was mutated while being enumerated.'
#import "ViewController.h"
@interface
ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
//[self testError]; //错误
//[self testSolve1]; //解决方法1
//[self testSolve2]; //解决方法2
}
- (void)testError {
NSMutableArray *array = [NSMutableArrayarrayWithObjects:@1,@2,@3,@4,@5,@6,nil];
for (NSNumber *numin array) {
if ([num isEqualToNumber:@4]) {
NSLog(@"删除数组中的数字4");
[array removeObject:num];
}
}
//用for循环去遍历一个数组,然后删除该数组中的一些元素的操作,就会出现程序崩溃的情况。因为一个数组不能同时有一个线程去读取,然后另一个线程去写,所以出错
}
//解决方法1:定义一个一模一样的临时数组,遍历临时数组然后操作原数组
- (void)testSolve1 {
NSMutableArray *array = [NSMutableArrayarrayWithObjects:@1,@2,@3,@4,@5,@6,nil];
NSMutableArray *tempArray = [NSMutableArrayarrayWithArray:array];
for (NSNumber *numin tempArray) {
if ([num isEqualToNumber:@4]) {
NSLog(@"删除数组中的数字4");
[array removeObject:num];
}
}
NSRange range =
NSMakeRange(0, [array
count]);
NSArray *subArray = [array
subarrayWithRange:range];
NSLog(@"打印所有元素:%@",subArray);
}
//解决方法2:利用block来操作,原理:找到符合的条件之后,暂停遍历,然后修改数组的内容
- (void)testSolve2 {
NSMutableArray *array = [NSMutableArrayarrayWithObjects:@1,@2,@3,@4,@5,@6,nil];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj,
NSUInteger idx,BOOL *
_Nonnull stop) {
if ([obj isEqualToValue:@4]) {
*stop = YES;
}
if (*stop) {
[array removeObject:obj];
NSLog(@"打印数组所有元素:%@",array);
}
}];
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
//解决
相关文章推荐
- 稀疏表示与压缩感知
- PS中图层混合模式的Blend公式
- 【JAVA重温】String 类
- hadoop SecondNamenode
- UITextField小结
- 【BZOJ-3996】线性代数 最小割-最大流
- php多线程
- mysqld
- 1045. Favorite Color Stripe (30)
- ViewTreeObserver
- PL/SQL Developer连接Oracle数据库
- LeetCode/sort(地址A,地址B)和qsort(首地址,元素个数,sizeof(),cmp比较函数)的使用
- 用Berkeley sockets实现ios上进程间通信
- 如何给 eclipse 设置快捷键
- (OK) VirtualBox 5.0.10 中 Fedora 23 在安装了增强工具后无法自动调节虚拟机分辨率的问题
- C语言与MATLAB接口 编程与实例 李传军编着
- Nginx + Tomcat + HTTPS 配置不需要在 Tomcat 上启用 SSL 支持
- 2016-04-07
- C++第3次实验
- android自定义全屏dialog