ios開發中的深拷貝和淺拷貝

這是一個老生常談的話題,面試中也常常被問到,下面總結一下本身的一些心得。面試

一句話總結: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出來的對象是一個不可變的對象。

相關文章
相關標籤/搜索