拷貝

一、拷貝:

任何實現(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; 這個方法。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容