转载

iOS深拷贝与浅拷贝

基础知识:

1.iOS中要实现copy与mutableCopy,需要遵守,两个协议.

2.浅拷贝拷贝对象,不拷贝对象中的属性,深拷贝拷贝对象及属性.

3.对于可变对象,使用copy或者mutableCopy都是深拷贝,对于不可变对象,copy方法是浅拷贝, mutableCopy是深拷贝

验证:

guard let vc = R.storyboard.mine.productEditTVC() else { return }
    vc.model = self.model.copy() as! ProductModel
    var productModel = self.model.copy() as! ProductModel
    debugPrint(productModel)
    debugPrint(self.model)

以上model是可变的,内部的属性cover及owner是不可变的,copy得到productModel之后打印结果如下:

self.model:

iOS深拷贝与浅拷贝

productModel:

iOS深拷贝与浅拷贝

可以看出copy可变对象时,copy后的对象的指针发生了改变,如最外层的内存地址改变了,深拷贝;

copy不可变对象时,copy后的对象的指针没有发生改变,如cover及owner,浅拷贝,相当于之前OC中的对对象做了一次retain;

当然,这里有不严谨的地方,我是直接用了深拷贝会拷贝对象及内部属性这个结论,也就是copy model的时候同时copy了cover及owner属性,有兴趣的可以拆开来验证.

实例:

当由A界面跳转到B界面的时候,B界面需要使用A界面的数据,如果我们直接赋值,如果是浅拷贝,那么当在B界面数据被改变后,A界面的数据也是同时会被改变的,所以当由A界面跳转B界面的时候,我们要使用深拷贝,保证数据不受影响,如果跳转回来需要用到改变后的数据的话可以使用闭包带回来,减少页面之间的耦合性.

正文到此结束
Loading...