當前位置:成語大全網 - 書法字典 - 理解iOS中的深度和黑暗拷貝——為什麽NSString要用copy?

理解iOS中的深度和黑暗拷貝——為什麽NSString要用copy?

我壹直以為自己對暗本和亮本都有透徹的了解,但是在最近的壹次面試中被問到了這樣的問題。

這個概念比較好理解,看圖就好。

淺拷貝:指針拷貝,拷貝壹個新的指針,只是想著同壹個內存區域。不會復制實際內存。

深層復制:內容復制,將數據復制到新的內存區域,指針指向被復制的數據區域。

強:淺拷貝,也就是指針引用,很明顯。我們來測試壹下。

運行結果如下,實物壹致。

這意味著A使用屬性對變量字符串做類似appendstring的操作,B中的值也會被修改。

Copy:這裏我們研究系統的NSstring和NSArray對象復制後是什麽樣子。

我們先來看壹個有趣的現象。我們創建壹個新的NSMutableString,然後復制它,然後用這個copy對象調用惟壹的appendstring來修改字符串。

結果呢?

退後。這是為什麽呢?

仔細看看。在我們的MutableString對象調用copy之後,被復制的字符串的內存地址發生了變化,這意味著這裏發生了深度復制。

然後我們用copyString調用appendString方法,發生了壹個非常有規律的閃回。日誌顯示我們復制了NSTaggedPointerString,這是壹個不可變的字符串。

也就是說,變量字符串在復制後會被深度復制,復制的字符串是不可變的字符串!

接下來,讓我們測試壹下如果復制壹個NSString對象會是什麽樣子。

結果是這是淺拷貝,地址沒變。

我們由此得出結論:

Copy不壹定是淺拷貝,壹定是不可變的字符串或數組。如果被復制的對象是可變數組或字符串,此時將發生深度復制,反之亦然。

可變拷貝

這裏不需要貼驗證。直接結果就是,MutableCopy必須是字符串和數組的深層副本,復制的對象必須是變量字符串或數組。即使復制的對象是不可變的字符串。

來自1的字符串。copy必須是不可變的字符串。如果傳入壹個可變字符串,深度拷貝將作為壹個不可變字符串出現,否則它將是壹個淺層拷貝。

2.mutablecopy,必須是深度拷貝,拷貝的字符串必須是可變字符串或數組,即使是不可變的字符串或數組。