一、拷貝:
任何實現(xiàn)拷貝功能都需要實現(xiàn)NSCopying協(xié)議。
1、深拷貝:
開辟一個新空間,對對象本身進行拷貝以外,還會對對象里包含的子元素逐個進行拷貝,指向的內(nèi)存新的內(nèi)存空間。
2、淺拷貝:
開辟一個新的空間,但是空間指向的內(nèi)容(內(nèi)存空間、指針)還是原來的內(nèi)容。
二、copy 和 mutableCopy
NSString * s = [NSString stringWithFormat:@"hello"];
NSString * s2 = [s copy];
/--這個時候把 s 拷貝了一份 s2 還是一個只讀的字符串
NSMutableString * s3 = [s mutableCopy];
[s3 appendString: @"ss"];
/--這個時候把 s 拷貝了一份 s3 是一個可變的字符串 ,這樣可以通過 mutableCopy 可以把不可變的字符串變成可變字符串;
反之也可使用 copy 把可變字符串變成不可變的字符串。
NSMutableString * s4 = [NSMutableString stringWithFormat:@"4444"];
NSMutableString * s5 = [s4 copy]; //---s5 是一個不可變的字符串,copy把可變的變成不可變的。
如果是對類這個對象進行 copy ,就要在類的 .h文件遵循NSCopying協(xié)議。
//在類 .m文件里面使用NSCopying協(xié)議里的方法
//一旦使用了 [** copy]; ,這個方法就會得到觸發(fā)
-(id)copyWithZone: (NSZone *) zone{
/新分配一個對象
類 * m = [[self class] allocWithZone: zone]init];
/比如 copy 名字 name
m.name = self.name;
return m;
}
//實現(xiàn)上述的類進行 copy 操作 如類是:Dog
Dog * m1 = [[Dog alloc]init];
m1.name = "小黃";
Dog * m2 = [m1 copy];
// [m1 copy]; 就會觸發(fā) -(id)copyWithZone: (NSZone *) zone; 這個方法。