iOS 淺拷貝和深拷貝

1、對象拷貝,使用關(guān)鍵字 copy 和 mutableCopy,使用這兩個方法即可復(fù)制已存在的對象
自定義類想要具備可復(fù)制功能,必須實現(xiàn)NSCopying 或 NSMutableCopy
copy 返回的是不可變對象,mutableCopy 返回的是可變對象
讓自定義的類具有 copy 和 mutableCopy,這個類需遵守NSCopying、NSMutableCopying協(xié)議并實現(xiàn)協(xié)議方法
2、淺拷貝只是復(fù)制指向?qū)ο蟮闹羔?,不會開辟新的內(nèi)存空間,兩個指針指向同一塊內(nèi)存空間

NSArray *array = [NSArray arrayWithObject:@"1"];
NSLog(@"%p  -- %p",array,[array copy]);
// 0x6000006f6d30 
// 0x6000006f6d30
// %p 打印對象內(nèi)存地址

3、深拷貝會拷貝對象的具體內(nèi)容,然后指向一塊新的內(nèi)存地址
常見的幾種例子

// 第一種情況 
@property (nonatomic, strong) NSArray *list;

NSMutableArray *array = [NSMutableArray arrayWithObject:@"1"];
self.list = array;
NSLog(@"%@ -- %@",self.list, array);
NSLog(@"%p -- %p",self.list, array);
// 數(shù)組內(nèi)容一樣,內(nèi)存地址一樣
    
[array addObject:@"2"];
    
NSLog(@"%@ -- %@",self.list, array);
NSLog(@"%p -- %p",self.list, array);
// 修改數(shù)組后,數(shù)組內(nèi)容一樣,內(nèi)存地址也一樣
// 此種情況 為淺拷貝
// 第二種情況 
@property (nonatomic, copy) NSArray *list;

NSMutableArray *array = [NSMutableArray arrayWithObject:@"1"];
self.list = array;
NSLog(@"%@ -- %@",self.list, array);
NSLog(@"%p -- %p",self.list, array);
// 數(shù)組內(nèi)容一樣,內(nèi)存地址不一樣
    
[array addObject:@"2"];
    
NSLog(@"%@ -- %@",self.list, array);
NSLog(@"%p -- %p",self.list, array);
// 修改數(shù)組后,數(shù)組內(nèi)容不一樣,內(nèi)存地址也不一樣
// 此種情況為深拷貝
// 第三種情況
@property (nonatomic, strong) NSMutableArray *list;

NSMutableArray *array = [NSMutableArray arrayWithObject:@"1"];
self.list = array;
NSLog(@"%@ -- %@",self.list, array);
NSLog(@"\n%p \n%p",self.list, array);
// 數(shù)組內(nèi)容一樣,內(nèi)存地址一樣
    
[array addObject:@"2"];
    
NSLog(@"%@ -- %@",self.list, array);
NSLog(@"\n%p \n%p",self.list, array);
// 修改數(shù)組后,數(shù)組內(nèi)容一樣,內(nèi)存地址也一樣
// 此種情況 為淺拷貝

注意:@property 中可變類型不能使用 copy 修飾,@property 是由 ivar(屬性變量) + getter + setter 方法組成的,self.list 會調(diào)用 setter 方法,setter 方法中有 _list = [list copy]; 會將可變類型變?yōu)椴豢勺冾愋?,self.list 在調(diào)用增、刪、改等可變對象的方法時,會crash,找不到方法,報錯誤:unrecognized selector sent to instance 0x600001583330

// 第四種情況
NSArray *list = [NSArray arrayWithObject:@"1"];
NSArray *array = [list copy];
    
NSLog(@"\n%p\n%p",list,array);
// 內(nèi)存地址一樣
// 淺拷貝
// 第五種情況
NSArray *list = [NSArray arrayWithObject:@"1"];
NSMutableArray *array = [list mutableCopy];
NSLog(@"%@ -- %@",list,array);
NSLog(@"\n%p\n%p",list,array);
// 內(nèi)容一樣,內(nèi)存地址不一樣
    
[array addObject:@"2"];
NSLog(@"%@ -- %@",list,array);
NSLog(@"\n%p\n%p",list,array);
// 修改后,內(nèi)容不一樣,內(nèi)存地址也不一樣
// 深拷貝
// 第六種情況
NSMutableArray *list = [NSMutableArray arrayWithObject:@"1"];
NSArray *array = [list copy];
    
NSLog(@"%@ -- %@",list,array);
NSLog(@"\n%p\n%p",list,array);
// 內(nèi)容一樣,內(nèi)存地址不一樣
    
[list addObject:@"2"];
    
NSLog(@"%@ -- %@",list,array);
NSLog(@"\n%p\n%p",list,array);
// 修改后,內(nèi)容不一樣,內(nèi)存地址也不一樣
// 深拷貝
// 第七種情況
NSMutableArray *list = [NSMutableArray arrayWithObject:@"1"];
NSMutableArray *array = [list mutableCopy];
    
NSLog(@"%@ -- %@",list,array);
NSLog(@"\n%p\n%p",list,array);
// 內(nèi)容一樣,內(nèi)存地址不一樣
    
[list addObject:@"2"];
    
NSLog(@"%@ -- %@",list,array);
NSLog(@"\n%p\n%p",list,array);
// 修改后,內(nèi)容不一樣,內(nèi)存地址也不一樣
// 深拷貝
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,674評論 1 32
  • 深拷貝和淺拷貝這個問題在面試中常常被問到,而在實際開發(fā)中,只要稍有不慎,就會在這里出現(xiàn)問題。尤其對于初學(xué)者來說,我...
    weyan閱讀 565評論 0 1
  • 對于不可變的集合類對象進行 copy 操作,只是改變了指針,其內(nèi)存地址并沒有發(fā)生變化;進行 mutableCopy...
    魔性佛心閱讀 755評論 0 0
  • 《孟子﹒告子下》講,“夫道若大路然,豈難知哉?人病不求耳?!?就是講,道理就像大路一樣,哪里難于知道呢?只怕人不去...
    關(guān)觀閱讀 336評論 0 2
  • 安裝YouCompleteMe的步驟 用vundle中的安裝太慢,所以自己手動安裝檢查是否安裝clang、g++、...
    54Fire閱讀 7,340評論 2 0

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