美文网首页iOS 开发技术之经验总结篇
iOS 深拷贝,完全深拷贝(三)

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

作者: struggle3g | 来源:发表于2018-04-11 17:29 被阅读30次

    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 深拷贝,完全深拷贝(三)

        本文链接:https://www.haomeiwen.com/subject/ozrzhftx.html