先说结论:OC中有浅拷贝和深拷贝,浅拷贝只是对地址的引用,深拷贝是单独复制一份,两者地址不同。但是OC中的深拷贝并非完全深拷贝,比如字典中嵌套字典,那么对于第一层字典中的对象是深拷贝,而对于第二层字典中的数据依然只是地址的引用。如果需要完全深拷贝,可以使用NSKeyedArchiver来将数据保存为NSData类型,当需要使用时使用NSKeyedUnarchiver再转成字典。(PS:如果字典中有实例对象时,需要实现NSCoding协议,才能使用NSKeyedArchiver转成NSData)
我们在工作中经常需要使用NSString来记录数据,这里常用的修饰词有两个strong和copy。
一般来说我们都会使用copy修饰,防止数据在无意中被篡改。
打印的结果如下
可以看到当把一个可变字符串赋值给self.StrongString,修改String,也会影响到self.StrongString。
使用copy则不会有这种情况
strong修饰的可以理解为浅拷贝,它只是对对象地址的引用,所以修改原对象,StrongString也会一样改变。
而copy修饰的可以理解为深拷贝,它又另外复制了一份原对象,两者地址不同,所以修改原对象,CopyString不会改变。
而工作中最常碰到的就是从后台下一段json数据解析为字典,类似于NSString,浅拷贝和深拷贝也相同。
但是如果对该字典中嵌套的容器中的数据进行修改就无效了,因为iOS中的copy对于容器中容器的对象依然只是对地址的引用。比如修改school里面的High字段
如果想要对嵌套容器中的数据也进行copy(完全深拷贝),可以使用NSKeyedArchiver来将数据保存为NSData类型,当需要使用时使用NSKeyedUnarchiver再转成字典,这相当于对数据进行完全深拷贝。(PS:如果字典中有实例对象时,需要继承NSCoding协议,才能使用NSKeyedArchiver转成NSData)
网友评论