iOS 深拷贝,完全深拷贝(三)

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的数组地址不一样,它们中的元素的地址也不一样。
证明完全深拷贝。

此坑已埋

你可能感兴趣的:(iOS 深拷贝,完全深拷贝(三))