淺拷貝就是拷貝后州泊,并沒有進(jìn)行真正的復(fù)制冶共,而是復(fù)制的對象和原對象都指向同一個(gè)地址
深拷貝是真正的復(fù)制了一份蚀之,復(fù)制的對象指向了新的地址。
從上圖可以看出翅睛,淺拷貝A指針改變了所指向的內(nèi)容B指針也指向被修改后的內(nèi)容声搁。如果有些地方用到B指針,不希望在A指向的內(nèi)容發(fā)生變化時(shí)也跟著變化捕发,則需要用到深拷貝疏旨。通俗理解為:淺拷貝好比你的影子,你死了扎酷,影子也沒了檐涝;深拷貝好比克隆人,你死了法挨,它還在谁榜。
深拷貝和淺拷貝的本質(zhì)是地址是否相同
在開發(fā)過程中,大體上會(huì)區(qū)分為對象和容器兩個(gè)概念凡纳,對象的copy是淺拷貝窃植,mutablecopy是深拷貝。
容器包含對象的拷貝荐糜,無論是copy巷怜,還是mutablecopy都是淺拷貝,要想實(shí)現(xiàn)對象的深拷貝狞尔,必須自己提供拷貝方法丛版。
1、非容器不可變對象:NSString
2偏序、非容器可變對象: NSMutableString
3、容器類不可變對象: NSArray
4胖替、容器類可變對象: NSMutableArray
代碼測試
非容器不可變對象
結(jié)論:對于非容器不可變對象的copy為淺拷貝研儒,mutableCopy為深拷貝淺拷貝獲得的對象地址和原對象地址一致豫缨, 返回的對象為不可變對象深拷貝返回新的內(nèi)存地址,返回對象為可變對象
非容器可變對象
結(jié)論:對于非容器可變對象的copy為深拷貝mutableCopy為深拷貝并且copy和mutableCopy返回對象都為可變對象
容器不可變對象
結(jié)論:從上述輸出中可以看出容器類不可變對象mutableCopy確實(shí)返回一個(gè)新的容器端朵,但容器內(nèi)的元素仍然是淺拷貝
容器可變對象
總結(jié):
通過上述代碼分析:
copy: 對于可變對象為深拷貝好芭,對于不可變對象為淺拷貝
mutableCopy:始終是深拷貝
在OC中不是所有的類都支持拷貝,只有遵循<NSCopying>才支持copy冲呢,只有遵循<NSMutableCopying>才支持mutableCopy舍败。如果沒有遵循,拷貝時(shí)會(huì)直接Crash敬拓。