淺拷貝:淺拷貝是對object對象的指針拷貝,讓指針指向同一塊內存地址,“對象永遠只有一個",淺拷貝使對象的引用計數器+1。代碼如下:
可以看出不可變字符串的指針指向了同一地址,並沒有重新開辟內存。
深拷貝:深拷貝是對object對象的復制,保留原對象的值,開辟新的內存地址。
如圖中代碼,聲明一個可變數組,為WXDObject類添加一個用copy修飾的屬性,在類的實現后將指針指向可變數組,打印兩者的地址發現地址發生了變化。所以用copy修飾可變對象,將會進行深拷貝。
retain修飾:將上面array的修飾改為retain,對象引用計數器+1,指向同一地址,並沒有重新開辟內存地址。
總結:
retain:引用計數器+1,指向同一地址。結果和淺拷貝一樣,僅僅是使得對象的引用計數器自增1.
copy:對不可變對象等同與retain,指針拷貝,引用計數器+1。對可變對象執行深拷貝,等同mutableCopy,內容拷貝。
mutableCopy:深拷貝是重新創一個新對象,但是卻保留原來對象的值。內容拷貝。