iOS深複製和淺複製

2021-07-02 00:29:41 字數 1880 閱讀 6967

淺複製示例**:

nsmutablearray *marray = [nsmutablearray arraywithobjects:

[nsmutablestring stringwithstring: @"origiona"],

[nsmutablestring stringwithstring: @"origionb"],

[nsmutablestring stringwithstring: @"origionc"], nil];

nsmutablearray *marraycopy = [marray mutablecopy];

nsmutablestring *string = [marray objectatindex:0];

[marraycopy removeobjectatindex:1];

nslog(@"object.name = %@",marray);

nslog(@"object.name = %@",marraycopy);

列印結果:

說明:

foundation類實現了名為copy和mutablecopy的方法,可以使用這些方法建立物件的副本,通過實現乙個符合協議(如下**)的方法來完成這個工作,如果必須區分要產生的物件是可變副本還是不可變副本,那麼通過協議來產生不可變副本,通過協議來產生可變副本。

然而foundation類的copy和mutablecopy方法,預設情況下只是對物件建立的乙個新的引用,他們都指向同一塊記憶體,也就是淺複製。因此就會出現上面的結果。

@protocol nscopying

- (id)copywithzone:(nszone *)zone;

@end

@protocol nsmutablecopying

- (id)mutablecopywithzone:(nszone *)zone;

@end

深複製示例**:

@inte***ce demoobject : nsobject@property (strong, nonatomic) nsmutablestring *name;

@end

@implementation demoobject

- (id)copywithzone:(nszone *)zone

- (id)init

return self;

}@end

demoobject* demoobject = [[demoobject alloc]init];

demoobject* newdemoobject = [demoobject copy];

nslog(@"demoobject.name = %@",demoobject.name);

nslog(@"newdemoobject.name = %@",newdemoobject.name);

列印結果:

說明:

自定義類中,必須實現或者協議並實現copywithzone:或者mutablecopywithzone:方法,才能響應copy和mutablecopy方法來複製物件。

引數zone與不同的儲存區有關,你可以在程式中分配並使用這些儲存區,只有在編寫要分配大量記憶體的應用程式並且想要通過將空間分配分組到這些儲存區中來優化記憶體分配時,才需要處理這些zone。可以使用傳遞給copywithzone:的值,並將它傳給名為allocwithzone:的記憶體分配方法。這個方法在指定儲存區中分配記憶體。

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 乙個...

深複製和淺複製

以下 是否完全正確,執行可能得到的結果是 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class a class b b void sayhello b b int main 程式正常執行 程式編譯錯誤 程式崩潰 程式死迴圈 這個程式會直接崩潰 voidsayhello ...