這個概念比較好理解,看圖就好。
淺拷貝:指針拷貝,拷貝壹個新的指針,只是想著同壹個內存區域。不會復制實際內存。
深層復制:內容復制,將數據復制到新的內存區域,指針指向被復制的數據區域。
強:淺拷貝,也就是指針引用,很明顯。我們來測試壹下。
運行結果如下,實物壹致。
這意味著A使用屬性對變量字符串做類似appendstring的操作,B中的值也會被修改。
Copy:這裏我們研究系統的NSstring和NSArray對象復制後是什麽樣子。
我們先來看壹個有趣的現象。我們創建壹個新的NSMutableString,然後復制它,然後用這個copy對象調用惟壹的appendstring來修改字符串。
結果呢?
退後。這是為什麽呢?
仔細看看。在我們的MutableString對象調用copy之後,被復制的字符串的內存地址發生了變化,這意味著這裏發生了深度復制。
然後我們用copyString調用appendString方法,發生了壹個非常有規律的閃回。日誌顯示我們復制了NSTaggedPointerString,這是壹個不可變的字符串。
也就是說,變量字符串在復制後會被深度復制,復制的字符串是不可變的字符串!
接下來,讓我們測試壹下如果復制壹個NSString對象會是什麽樣子。
結果是這是淺拷貝,地址沒變。
我們由此得出結論:
Copy不壹定是淺拷貝,壹定是不可變的字符串或數組。如果被復制的對象是可變數組或字符串,此時將發生深度復制,反之亦然。
可變拷貝
這裏不需要貼驗證。直接結果就是,MutableCopy必須是字符串和數組的深層副本,復制的對象必須是變量字符串或數組。即使復制的對象是不可變的字符串。
來自1的字符串。copy必須是不可變的字符串。如果傳入壹個可變字符串,深度拷貝將作為壹個不可變字符串出現,否則它將是壹個淺層拷貝。
2.mutablecopy,必須是深度拷貝,拷貝的字符串必須是可變字符串或數組,即使是不可變的字符串或數組。