什么是文件拷貝
我們在使用電腦的時候,經(jīng)常會有一個操作,就是ctrl+c和ctrl+v,就是拷貝。
這個拷貝的結(jié)果,就是產(chǎn)生一個副本,該副本與源文件完全一致,而且兩者互不影響。
修改源文件,不會影響副本文件,而修改副本文件也不會影響源文件。
我們也將這種操作成為克隆
什么是對象拷貝
對象拷貝與文件拷貝類似,新對象與源對象互不影響
深拷貝&淺拷貝
淺拷貝:指針拷貝
深拷貝:堆內(nèi)容拷貝
ios拷貝的兩種方式
1.copy不可變拷貝,產(chǎn)生不可變副本(劃重點)
2.mutableCopy可變拷貝,產(chǎn)生可變副本(劃重點)

拷貝結(jié)果

NSArray的拷貝結(jié)果
? ??
自定義對象類型
對象類型要想支持拷貝,就需要實現(xiàn)NSCopying接口,自定義對象的copy或者mutablecopy都是深拷貝,也就是內(nèi)存拷貝
自定義容器對象
對容器對象中的數(shù)據(jù)進行深拷貝,只能使用alloc initwitharray copyItems:yes?
不過一般來說不建議這樣做,nsarray數(shù)據(jù)對象太大,深拷貝導(dǎo)致內(nèi)存讀寫太頻繁,在上層進行深拷貝,就不需要alloc太大的內(nèi)存空間,性能更快
引申
本文描述的是ios的深淺拷貝,其實,c/c++/python/js/java等各個語言都有深淺拷貝。其原理也很簡單:
淺拷貝是指針拷貝,深拷貝是副本拷貝。
如果理解變量的創(chuàng)建過程,就能順理成章的理解了,那就是創(chuàng)建變量意味著棧中和堆中都開辟空間,堆中存儲變量值,棧中存儲指針,指向堆中的值

變量的創(chuàng)建