字符串
不可變 -> 可變
可變 -> 可變
可變 -> 不可變
不可變 -> 不可變
由以上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,相當于一直強引用著.