oc的淺拷貝和深拷貝

淺拷貝

淺拷貝是對內存地址的複製,讓目標對象指針和源對象指向同一片內存空間。如:

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的值就會被改變。 集合類對象以此類推。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章