NSMutableArray在界面传值的copy影响

数组的拷贝

关于数组的copy方法相信大家很多人都已经了解和掌握了,这里简单介绍一下NSMutableArray的copy。对NSMutableArray进行copy,得到的是NSArray类型,也就是说[NSMutableArray copy] 是深拷贝,而[NSMutableArray mutableCopy]也是深拷贝。

注意:这里对数组类型的容器类进行copy,只是拷贝了第一层元素的指针,并没有对所拥有的元素进行copy。

问题

之前在项目中碰到这样一种情况,我在A界面获取到到一个数组数据,要传递到B界面,B界面会对该数组的元素进行修改或者删除。B界面中声明一个pointsMArr属性作为接收数据数组,如下:

@property(nonatomic,strong)NSMutableArray*pointsMArr;

在界面中用如下方式进行赋值

B.pointsMArr = [NSMutableArrayarrayWithArray:[_pointsShowArr copy]];

那么下面问题来了,pointsMArr数组中包含的是一个个模型数据,我在B界面对其中一个模型数据进行修改然后不做保存,返回A界面。结果在A界面显示的该条模型数据也被改动了。

解决办法

当时碰到这个问题反复调试了多遍,还是很奇怪,明明已经对数组进行了copy(别问我明明是谁),但是操作赋值后的数组元素还是会对原数组产生影响。后来想到,我在两个界面分别打印原数组和赋值后的数组,看看有什么变化如下:


NSMutableArray在界面传值的copy影响_第1张图片
NSMutableArray在界面传值的copy影响_第2张图片

对比发现,虽然对数组进行了copy,但是数组内的元素地址并没有变化。也就是说没有对数组内的元素进行copy,所以在B界面修改了数组元素值,对原数组就会产生影响。

解决办法

既然知道了原因,那么就好解决了。在NSArray中找到- (instancetype)initWithArray:(NSArray *)array copyItems:(BOOL)flag方法。

通过这个方法对可变数组进行copy(是深拷贝)的时候,如果数组内的元素没有实现NSCopying协议,那么 对数组内的模型进行copy的是浅拷贝。所以,我们先在对应model中实现NSCopying协议,这样再调用上述方法才会对数组元素进行深拷贝。如下方法:

B.pointsMArr = [[NSMutableArray alloc] initWithArray:_pointsShowArr copyItems:YES];

OK,事情完美解决。

你可能感兴趣的:(NSMutableArray在界面传值的copy影响)