淺析copy

字符串

不可變 -> 可變

可變 -> 可變


可變 -> 不可變


不可變 -> 不可變


由以上log日志可以得出

不可變 -> 可變 ?在copy之后,老字符串和新字符串的內存地址是一樣的,所以在copy之后不會開辟出一塊兒新的內存空間,為淺拷貝.

可變 -> 可變 ?在copy之后,老字符串和新字符串的內存地址發生了變化,是不一致的,所以在copy之后,新字符串獨立申請出了一塊兒新的內存空間,為深拷貝.

可變 -> 不可變 同 可變 -> 可變 ? ?不可變 -> 不可變 ?同 不可變 -> 可變

數組

可變 -> 可變


可變 -> 不可變


不可變 -> 不可變

不可變 -> 可變

由以上log日志可以看出:

可變 -> 不可變? 會申請新的內存? 內置對象? 不會申請新的內存?

可變 -> 可變? ? 會申請新的內存? 內置對象? 不會申請新的內存

不可變 -> 可變? 不會申請新的內存 內置對象? 不會申請新的內存

不可變 -> 不可變? 不會申請新的內存? 內置對象? 不會申請新的內存

而字典也是如此?

有內置對象地址可以看出. 不管是數組還是字典,都只是對外置容器的copy,并沒有實質性的對數組內部的元素進行copy,由此可以看出,數組和數組元素是兩個東西.如果我們想強制性實現深copy.那么就需要具體到某個類中去實現NSCopying協議,按照自己的方法去執行深copy.

由此可以看出,賦值對象的時決定采用淺拷貝還是深拷貝,一般情況下盡量執行淺拷貝.

為什么字符串要使用copy


根據以上代碼可以得出結論,如果字符串使用strong來修飾,當你創建一個可變的字符串,向name賦值的時候,如果你改變了str的值,那么name的值也會跟著改.但是如果用copy的話就不會有這個問題,互不影響,所以說在一定程度上保證了數據的安全性吧.

Block為什么要使用copy


由以上代碼可以看出

全局的block是存儲在代碼區(存儲方法或函數)

block內部訪問外部變量,block本身是一個結構體,存儲在棧區.但是棧區可能會被隨時回收

如果對block進行一次copy操作的話,block就會成堆block,相當于一直強引用著.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容