iOS 深、浅拷贝NSArray、NSMutableArray(二)挖坑的内容
上两篇,主要是讲了深、浅拷贝实现,以及理解。单层深拷贝、浅拷贝,最后挖坑没有介绍到完全深拷贝的实现。
熟悉下概念
浅拷贝(shallow copy):在浅复制操作时,对于被复制对象的每一层都是指针复制。
深拷贝(one-level-deep copy):在深复制操作时,对于被复制对象,至少有一层是深复制。
完全拷贝(real-deep copy):在完全复制操作时,对于被复制对象的每一层都是对象复制。
No1:可变对象的copy和mutableCopy方法都是深拷贝(区别完全深拷贝与单层深拷贝) 。
No2:不可变对象的copy方法是浅拷贝,mutableCopy方法是深拷贝。//不安全
No3:copy方法返回的对象都是不可变对象。
废话不多说了;
完全深拷贝
代码验证单层深拷贝
NSMutableArray *marry1 = [[NSMutableArray alloc] init];
NSMutableString *mstr1 = [[NSMutableString alloc]initWithString:@"Cooci"];
NSMutableString *mstr2 = [[NSMutableString alloc]initWithString:@"Gavin"];
[marry1 addObject:mstr1];
[marry1 addObject:mstr2];
NSLog(@"marry1:%p - %@ \r\n",marry1,marry1);
NSLog(@"marry1数组元素地址:value1:%p - value2:%p \r\n",marry1[0],marry1[1]);
NSMutableArray *MutablemArray1 = [marry1 copy];
NSLog(@"MutablemArray1:%p - %@",MutablemArray1,MutablemArray1);
NSLog(@"MutablemArray1数组元素地址:value1:%p - value2:%p \r\n",MutablemArray1[0],MutablemArray1[1]);
对可变的对象进行copy是深拷贝,可以去上面两篇文章(一,二)查看不再介绍
打印结果
marry1数组打印的结果
marry1:0x1d0446ab0 - (
Cooci,
Gavin
)
marry1数组元素地址:value1:0x1d0446db0 - value2:0x1d0446a50
MutablemArray1数组对象打印结果
MutablemArray1:0x1d0032200 - (
Cooci,
Gavin
)
MutablemArray1数组元素地址:value1:0x1d0446db0 - value2:0x1d0446a50
验证结果:
大家可以看到的:
Marry1 Copy出来的内容MutablemArray1
marry1:0x1d0446ab0 MutablemArray1:0x1d0032200 数组指针不一样
marry1数组元素地址:value1:0x1d0446db0 - value2:0x1d0446a50
MutablemArray1数组元素地址:value1:0x1d0446db0 - value2:0x1d0446a50
但是marry1、MutablemArray1中元素的地址相同。
证明单层深拷贝。
代码验证完全深拷贝的实现
实现的方式可以使用归档,解档的形式进行实现。
NSMutableArray *marry1 = [[NSMutableArray alloc] init];
NSMutableString *mstr1 = [[NSMutableString alloc]initWithString:@"Cooci"];
NSMutableString *mstr2 = [[NSMutableString alloc]initWithString:@"Gavin"];
[marry1 addObject:mstr1];
[marry1 addObject:mstr2];
NSLog(@"marry1:%p - %@ \r\n",marry1,marry1);
NSLog(@"marry1数组元素地址:value1:%p - value2:%p \r\n",marry1[0],marry1[1]);
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:marry1];
NSArray *marray2 = [NSKeyedUnarchiver unarchiveTopLevelObjectWithData:data error:nil];
NSLog(@"marry2:%p - %@ \r\n",marray2,marray2);
NSLog(@"marry2数组元素地址:value1:%p - value2:%p \r\n",marray2[0],marray2[1]);
打印结果
marry1:0x1d0456500 - (
Cooci,
Gavin
)
marry1数组元素地址:value1:0x1d0456800 - value2:0x1d04564a0
marry2:0x1d0456770 - (
Cooci,
Gavin
)
marry2数组元素地址:value1:0x1d0456620 - value2:0x1d0456710
验证结果
大家可以看到的:
1.marry1 与marry2的数组地址不一样,它们中的元素的地址也不一样。
证明完全深拷贝。
网友评论