iOS自定義類的深複製和淺複製

2021-10-02 12:08:54 字數 1093 閱讀 8656

copy返回的物件是不可變的。

mutablecopy返回的物件是可變的。

[nsmutablestring copy] 返回的字串是不可修改的。

[nsstring mutablecopy]返回的字串是可以修改的。

正因如此,nsmutablestring的copy和mutablecopy都是深複製

copy 和mutablecopy返回的都是副本,副本修改,原件是不會跟著修改的

單層複製除外

物件類似於指標型別,對於nsstring的不可修改是指字串本身不能修改,而不是不能更改指向,這個nsstring放的只是字串的位址。看的太多導致我在這個地方迷糊了。

繼承nscopying,重寫copywithzone。

在這個方法裡,我查閱了許多資料,畢竟是自定義類,定義五花八門,因為是簡單的自定義類,(沒有區分可變和不可變)

@inte***ce student : nsobject

@property(nonatomic,copy)nsstring * name;

@end

@implementation student

-(id)copywithzone:(nszone *)zone

-(id)mutablecopywithzone:(nszone *)zone

@end

這裡mutablecopywithzone裡,深複製卻直接賦值。

這其實和nsarray差不多,是單層深複製,但是這裡寫成mutablecopy效果是一樣的。因為name的屬性關鍵字是copy,在執行set方法時傳的是[self.name mutablecopy]的不可變副本。也就是說不論這是copy還是mutablecopy,這裡的name始終是不可變的。如果用mutablecopy就成了深複製,複製物件和它的屬性的位址都與被複製的物件位址不同。

iOS深複製和淺複製

淺複製示例 nsmutablearray marray nsmutablearray arraywithobjects nsmutablestring stringwithstring origiona nsmutablestring stringwithstring origionb nsmuta...

iOS 深複製和淺複製

一 copy與retain的區別 1 copy是建立乙個新物件,retain是建立乙個指標,引用物件計數加一。2 copy屬性表示兩個物件內容相同,新的物件retain為1,與舊有的物件的引用計數無關,舊有物件沒有改變。copy減少物件對上下文的依賴。3 retain屬性表示兩個物件位址相同 建立乙...

淺複製和深複製

在c 中,下面三種物件需要呼叫拷貝建構函式 有時也稱 複製建構函式 1 乙個物件作為函式引數,以值傳遞的方式傳入函式體 全域性函式,傳入的是物件 void g fun resume c 2 乙個物件作為函式返回值,以值傳遞的方式從函式返回 全域性函式 返回的是物件 resume g fun 3 乙個...