這是一個老生常談的話題,面試中也常常被問到,下面總結一下本身的一些心得。面試
一句話總結:spa
淺拷貝就是指針拷貝;指針
深拷貝是對象自己的拷貝;對象
下面一張抽象的圖能夠直觀的表述出兩句話的內涵blog
其實這裏還引伸出了一個新的問題:爲何NSString要用copy修飾table
在oc中父類的指針能夠指向子類的對象,這一現象是oc中多態的一個特性。引用
假設聲明瞭一個NSString對象,而後讓它指向一個NSMutableString對象,這一點是徹底能夠的,由於NSMutableString的父類是NSSting。NSMutableString是一個能夠改變的對象,若是咱們用strong修飾,NSString對象強引用了NSMutableString對象。假如咱們在其餘的地方修改了這個NSMutableString對象,那麼NSString的值會隨之改變,可是我麼你的本意是不讓他改變,這就使得NSSting對象的值收到了NSMutableString 的印象。im
這是咱們就能夠用copy,來從新生成一個對象。總結
可是,這裏並非簡單的copy,其中還有各類狀況出現img
一、對NSString 進行copy -> 這是一個淺拷貝,可是由於是不可變對象,後期值也不會改變;
二、對NSString 進行mutableCopy -> 這是一個深拷貝,可是拷貝出來的是一個可變的對象NSMutableString;
三、對NSMutableString 進行copy -> 這是一個深拷貝,拷貝出來一個不可變的對象;
四、對NSmutableString 進行mutableCopy -> 這是一個深拷貝,拷貝出來一個可變的對象;
咱們能夠總結爲:
對對象進行mutableCopy,無論是可變仍是不可變對象都是深拷貝,而且拷貝出來的對象是可變的對象;
對對象進行copy,copy出來的對象是一個不可變的對象。