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)存地址也不一樣
// 深拷貝