持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
今天在项目中遇到一个问题,应该是属于很容易就会在不经意直接就会出现的。
先说说出现的问题。
刚开始,在A界面有个数组,需要传到B界面去做做判断,所以我就写了
B.arr_2 = self.arr_1
这样就先把arr传到B界面了。
然后经过大概半年的迭代,现在需要在B界面操作这个arr_2,将数组的内容进行删改。这一改就出现问题了。
第一次进入B界面,如果操作了B界面的arr_2,就会导致在从B返回A,然后再次进入B界面时,B界面的arr_2数据发生变化。(ps:前提是A界面不出栈)
上面这段话其实就是这个BUG,复现的经过。可能有点绕...
这个BUG出现的原因简单来说就是,传过去的arr_1和在B界面进行操作的arr_2的地址是一样的,所以,如果在在B界面进行操作,就会导致,再次从A界面进入B界面传入的arr_1数据出现问题。
解决方式呢,有两种。
第一种
如果A界面的arr_1是请求来的,就最好每次当A界面显示的时候,重新请求一次,就是在viewDidAppear这个函数里做请求操作。这样就防止B界面的修改,导致A界面的数据发生变化。
第二种
从A界面传值到B界面时,将所传的值进行深拷贝,重新拷贝一份数据给B界面。这样无论B界面中如何操作A界面传来的值,都不会影响到A界面的原始值。
当然,所传的值或者对象如果要深拷贝,就要遵守<NSCoping>协议。特别是对象,
要实现这个方法
- (id)copyWithZone:(NSZone *)zone {
TestModel * model = [[self class] allocWithZone:zone];
model.name = _name.copy;
return model;
}
这个方法里面,每个对象的属性都要进行copy操作。
最好的方式就是用YYModel里的方法
- (id)copyWithZone:(NSZone *)zone {
return [self yy_modelCopy];
}
简单明了。
站着巨人的肩膀上开发,还是真舒服。
结语
这种问题其实在开发过程中,应该是比较普遍存在的,稍不注意,或者时间一长,就容易发生。
如图