发布网友 发布时间:2023-02-08 10:32
共1个回答
热心网友 时间:2023-11-07 07:27
浅拷贝又叫指针拷贝,只拷贝对象指针,不创建新的对象,拷贝对象和原对象都指向同一块内存地址的内容。
深拷贝又叫内容拷贝,深拷贝时系统会开辟新的内存空间,把对象存入新的内存区域,相较于原来对象,拷贝对象是一个新的对象,原对象的改变不影响新对象;
大家知道,我们创建NSString属性时候修饰词用的是copy,要是换成strong会怎么呢?请看:
可以看到我们修改strCoptTest,拷贝对象也被修改了。如果我们用copy修饰NSString属性则不会出现这问题,为什么copy修饰不会出现这个问题呢?
参照其他对象,在此猜测当copy对象为NSMutableString对象,NSCopying协议实现里新建了副本对象(等于深拷贝,此时拷贝对象指向一个新地址)
对象用copy修饰
可以看到我们修改arrMut对象后,self.arrList对象的值被动被修改了,这不是我们想要的结果。
执行效果,可以看到避免了被动修改的情况
新建Person类
发现无论是strong还是copy修饰都不安全,和NSString例子同样情况,如下
可以看到arrMut的第一个成员变量person1的name被修改为haha,self.arrList的第一个成员的名字也变为了haha,这不是我们想要的,为什么呢?
上面说到是因为数组内对象没有实现深拷贝,所以我们的目的就是把数组内对象也实现深拷贝,正好NSArray也提供了对应方法:
1.不可变类型属性修饰词用copy;
2.对集合类对象,copy时内部成员变量也要深拷贝;
3.自定义的对象要使用copy的遵循NSCopying协议,实现copyWithZone方法;
1.不可变对象的copy都是浅拷贝,副本类型为不可变类型;
2.不可变对象mutableCopy是深拷贝,副本类型为可变类型;
3.可变对象的copy都是是深拷贝,副本类型为不可变类型;
4.可变对象mutableCopy是深拷贝,副本类型为可变类型;
1.copy修饰的属性,在set方法会进行copy操作,而strong只是赋值;
2.浅拷贝会对原对象指针进行引用,原对象引用计数retainCount会+1,相当于strong;
3.深拷贝等于重新创建一个新对象,不会对原对象有引用关系,原对象retainCount不变;
但是用strong修饰是浅拷贝,会存在原对象被修改,当前对象也被动被改的情况,所以对可变对象赋值时候手动调用mutableCopy;
git传送门:CopyTestDemo