zoukankan      html  css  js  c++  java
  • [iOS]深拷贝/浅拷贝区别

    来点鸡汤:

    // 所谓拷贝 就是在原有的对象的基础上产生一个新的副本对象.有两点原则:
    //   1. 改变原对象的属性和行为不会影响副本对象
    //   2. 改变副本对象的属性和行为不会影响原对象


    来段示例代码
    - (void)viewDidLoad {
        [super viewDidLoad];
        /##########################################/
        // 以NSArray 为例
        /##########################################/
        
        // 1. 不可变对象调用copy方法
        NSArray *arr1 = [NSArray arrayWithObjects:@"1", nil];
        // 不会产生新对象
        NSArray *copyArr1 = [arr1 copy];
        
        NSLog(@"%p, %p
    ", arr1, copyArr1);
        NSLog(@"%ld, %ld
    ", [arr1 retainCount], [copyArr1 retainCount]); // 字符串引用计数-1
        /##########################################/
        // 打印结果
            **0x7fbdd340dbf0, 0x7fbdd340dbf0**
                2, 2
        // 这个为浅拷贝, 没有产生新对象, copyArr1还是指向arr1的地址
    ![1.不可变对象调用copy方法.png](//upload-images.jianshu.io/upload_images/1400788-107ba7070e903e47.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
        /##########################################/
        // 2. 不可变对象调用mutableCopy方法
        NSArray *arr2 = [NSArray arrayWithObjects:@"2", nil];
        // 会产生新的可变对象
        NSArray *mutableCopyArr2 = [arr2 mutableCopy];
        
        NSLog(@"%p, %p
    ", arr2, mutableCopyArr2);
        NSLog(@"%ld, %ld", [arr2 retainCount], [mutableCopyArr2 retainCount]);
        /##########################################/
        // 打印结果
            **0x7fbdd3600250, 0x7fbdd36445ba**
                1, 1
        // 这个为深拷贝, 产生新的对象, 引用计数分别为1
    ![2.不可变对象调用mutableCopy方法.png](//upload-images.jianshu.io/upload_images/1400788-e0b7176e1cbca7c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
        /##########################################/
        // 3. 可变对象调用copy方法
        NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@"3", nil];
        // 会产生不可变对象
        id copyArr3 = [arr3 copy];
        
        NSLog(@"%@, %p, %p
    ", [copyArr3 class], arr3, copyArr3);
        NSLog(@"%ld, %ld", [arr3 retainCount], [copyArr3 retainCount]);
        /##########################################/
        // 打印结果
                **__NSArrayI, 0x7fb120f12a40, 0x7fb120f10c70**
                 1, 1
        // NSArrayI代表不可变数组, 这个为深拷贝, 产生新对象(由可变对象变成不可变对象), 引用计数分别为1
    ![3.可变对象调用copy方法.png](//upload-images.jianshu.io/upload_images/1400788-ba00f376633b7f8c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
        /##########################################/    
        // 4. 可变对象调用mutableCopy方法
        NSMutableArray *arr4 = [NSMutableArray arrayWithObjects:@"4", nil];
        
        // 会产生可变对象
        id mutableCopyArr4 = [arr4 mutableCopy];
        
        NSLog(@"%@, %p, %p", [arr4 class], arr4, mutableCopyArr4);
        NSLog(@"%ld, %ld", [arr4 retainCount], [mutableCopyArr4 retainCount]);
    /##################################################/    
     // 打印结果
                **__NSArrayM, 0x7fc06062f930, 0x7fc06052f960**
                 1, 1
        // NSArrayM代表可变数组, 这个为深拷贝, 地址不同, 引用计数分别为1
    ![4.可变对象调用mutableCopy方法.png](//upload-images.jianshu.io/upload_images/1400788-16bd08da342a095c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
     /##################################################/    
    //    总结:
        /*
         只有在第一种情况才是浅复制
         运用copy的终极目的是: 当我赋值后,改变旧值不会影响新值. 如果要改变,就用retain
         浅拷贝: 好比是你的影子, 你完了, 影子也完了.
         深拷贝: 好比是你的克隆人, 你完了, 克隆人还在.
         
         */
        
    }
    
  • 相关阅读:
    mysql字节乱码问题之解决方法
    tracert nbtstat nslookup arp指令用法及示例
    Java ThreadLocal示例及使用方法总结
    C# Undo Redo
    自定义过滤器
    C#粘贴复制数据库中的内容
    分布式数据同步
    创建路径(c#)动态分段
    构建网络数据集(c#)
    创建一个栅格图层
  • 原文地址:https://www.cnblogs.com/lidongxu/p/5642150.html
Copyright © 2011-2022 走看看