iOS 深拷貝淺拷貝例項

2021-08-07 10:29:24 字數 3510 閱讀 9467

nsstring *string = @"漢斯哈哈哈";

// 沒有產生新物件

nsstring *copystring = [string copy];

// 產生新物件

nsmutablestring *mutablecopystring = [string mutablecopy];

nslog(@"string = %p copystring = %p mutablecopystring = %p", string, copystring, mutablecopystring);

nsmutablestring *string = [nsmutablestring stringwithstring:@"漢斯哈哈哈"];

// 產生新物件

nsstring *copystring = [string copy];

// 產生新物件

nsmutablestring *mutablecopystring = [string mutablecopy];

nslog(@"string = %p copystring = %p mutablecopystring = %p", string, copystring, mutablecopystring);

結論:

注意:其他物件nsarray、nsmutablearray 、nsdictionary、nsmutabledictionary一樣適用

hsperson *copyp = [p copy]; // 這裡崩潰

崩潰:

看崩潰資訊hsperson應該先實現:

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

#import "hsperson.h"

@inte***ce hsperson()@end

@implementation hsperson

- (id)copywithzone:(nszone *)zone

@end

hsperson *p = [[hsperson alloc] init];

p.age = 20;

p.height = 170.0;

hsperson *copyp = [p copy];

nslog(@"copyp: %@", copyp);

可以看出copywithzone重新分配新的記憶體空間,則:

- (id)copywithzone:(nszone *)zone

hsperson *p = [[hsperson alloc] init];

p.age = 20;

p.height = 170.0;

hsperson *copyp = [p copy];

nslog(@"p = %p copyp = %p", p, copyp);

nslog(@"age = %d height = %f", copyp.age, copyp.height);

雖然copy了份新的物件,然而age,height值並未copy,那麼:

這時你會想,有nsmutablecopying?沒錯,是有這貨:

- (id)mutablecopywithzone:(nszone *)zone

nscopying、nsmutablecopying有啥區別?

其實感覺沒必要有nsmutablecopying,因為壓根就沒可變的hsperson,但如果該物件有其他行為,可以借用nsmutablecopying實現,哈哈哈

說完深淺拷貝,理解property裡的copy、strong就輕鬆多了!

#import @inte***ce hsperson : nsobject

@property (nonatomic, copy) nsstring *name;

@end

nsmutablestring *string = [nsmutablestring stringwithformat:@"漢斯哈哈哈"];

hsperson *person = [[hsperson alloc] init];

person.name = string;

// 不能改變person.name的值,因為其內部copy新的物件

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

property copy 實際上就對name幹了這個:

- (void)setname:(nsstring *)name

假設name為nsmutablestring,會發生什麼事?

@property (nonatomic, copy) nsmutablestring *name;
這樣會挨罵哦,實際上內部還是:

- (void)setname:(nsmutablestring *)name

copy出來的仍然是不可變字元!如果有人用nsmutablestring的方法,就會崩潰:

@property (nonatomic, strong) nsstring *name;
nsmutablestring *string = [nsmutablestring stringwithformat:@"漢斯哈哈哈"];

hsperson *person = [[hsperson alloc] init];

person.name = string;

// 可以改變person.name的值,因為其內部沒有生成新的物件

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

iOS偽拷貝, 淺拷貝, 深拷貝

先來說說偽拷貝。偽拷貝就是生成了乙個指標變數,指向了某乙個物件。接下來我們來 下淺拷貝和深拷貝。首先,從copy開始說,簡而言之,copy的目的就是生成乙個新的例項,然後把其成員都按原例項賦值。對於非指標型的成員,比如bool,int,float,這樣的賦值可以直接進行。但是對於指標型的資料,比如o...

iOS深拷貝與淺拷貝

在大部分的程式語言中,都有深拷貝與淺拷貝的概念,如果使用深淺拷貝有誤,可能會造成資料安全性的問題,那麼本節針對oc中的深淺拷貝展開討論 深拷貝與淺拷貝的概念 我們在進行例項物件操作時,無非是兩種例項方式 建立新物件後將原物件的內容拷貝乙份,而後返回該物件引用 深淺拷貝的區別由此產生 以下是b物件拷貝...

深拷貝和淺拷貝 完整例項

1 淺拷貝 對基本資料型別進行值傳遞,對引用資料型別進行引用傳遞般的拷貝,此為淺拷貝。2 深拷貝 對基本資料型別進行值傳遞,對引用資料型別,建立乙個新的物件,並複製其內容,此為深拷貝。3 淺拷貝 clone 示例 public class student implements cloneable p...