淺拷貝
淺拷貝是對內存地址的複製,讓目標對象指針和源對象指向同一片內存空間。如:
char* str = (char*)malloc(100);
char* str2 = str;
淺拷貝只是對對象的簡單拷貝,讓幾個對象共用一片內存,當內存銷燬的時候,指向這片內存的幾個指針需要重新定義才能使用,要不然會成爲野指針。
iOS中的淺拷貝
在iOS中,retain關鍵字就是一種更加保險的淺拷貝。它既能讓幾個指針共用同一片內存空間,又可以在release方法中不會輕易的銷燬內存,達到更加簡單使用的目的。
深拷貝:
深拷貝是指拷貝對象的具體內容,而內存地址是自主分配的,拷貝結束後,兩個對象雖然存的值是相同的,但內存地址不一樣,兩個對象互不影響。
淺拷貝好比人和人的影子的關係,人消失影子消失。
深拷貝好比人和人的克隆人,人消失克隆人依然存在。
copy與retain的區別
copy是創建一個新對象,retain是創建一個指針,引用對象計數加一。copy屬性標識兩個對象內容相同,新的對象retain count爲1,與舊對象引用計數無關,舊對象沒有變化。copy減少對象上下文的依賴。
在非集合類對象中:對immutable對象進行copy操作,是指針複製,mutableCopy操作時內容複製;對mutable對象進行copy和mutableCopy都是內容複製。用代碼簡單表示如下:
-
[immutableObject copy] // 淺複製
-
[immutableObject mutableCopy] //深複製
-
[mutableObject copy] //深複製
-
[mutableObject mutableCopy] //深複製
比如以下代碼:
1
2
|
NSMutableString *string = [NSMutableString stringWithString:@ "origin" ]; //copy NSString *stringCopy = [string copy]; |
查看內存,會發現 string、stringCopy 內存地址都不一樣,說明此時都是做內容拷貝、深拷貝。即使你進行如下操作:
1
|
[string appendString:@ "origion!" ] |
stringCopy的值也不會因此改變,但是如果不使用copy,stringCopy的值就會被改變。 集合類對象以此類推。