美文网首页面试题大全
iOS 中浅拷贝,深拷贝和完全深拷贝

iOS 中浅拷贝,深拷贝和完全深拷贝

作者: b4067f4d3883 | 来源:发表于2018-04-04 10:51 被阅读165次

    先说结论: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)

    相关文章

      网友评论

        本文标题:iOS 中浅拷贝,深拷贝和完全深拷贝

        本文链接:https://www.haomeiwen.com/subject/jnvatftx.html