通过源码分析iOS中的深拷贝与浅拷贝

2020-01-21 07:02:55王冬梅

前言

关于iOS中对象的深拷贝和浅拷贝的文章有很多,但是大部分都是基于打印内存地址来推导结果,这篇文章是从源码的角度来分析深拷贝和浅拷贝。

深拷贝和浅拷贝的概念

拷贝的方式有两种:深拷贝和浅拷贝。

  • 浅拷贝又叫指针拷贝,比如说有一个指针,这个指针指向一个字符串,也就是说这个指针变量的值是这个字符串的地址,那么此时对这个字符串进行指针拷贝的意思就是又创建了一个指针变量,这个指针变量的值是这个字符串的地址,也就是这个字符串的引用计数+1。
  • 深拷贝又叫内容拷贝,比如有一个指针,这个指针指向一个字符串,也就是说这个指针变量的值是这个字符串的地址值,那么此时对这个字符串进行内容拷贝,就会创建一个新的指针,在一个新的地址区域创建一个字符串,这个字符串的值和原字符串的值相同,新的指针指向这个新创建的字符串。这时原字符串的引用计数没有+1。

    浅拷贝就是拷贝后,并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址

    深拷贝是真正的复制了一份,复制的对象指向了新的地址

    源码,iOS,深拷贝,浅拷贝

    从上图可以看出,浅拷贝A指针改变了所指向的内容B指针也指向被修改后的内容。如果有些地方用到B指针,不希望在A指向的内容发生变化时也跟着变化,则需要用到深拷贝。