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