• iOS中的 深拷贝和浅拷贝


    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[]) {
    //    一: copy 与 retain 的区别
    //    谁才有引用计数的概念:
    //    1. 堆区空间才有引用计数概念.
    //    2. 堆区的对象才会有引用计数.
        //%ld: - 1           %lu:18446744073709551615
        
    //retain:始终是浅拷贝。引用计数每次加一。
        //返回对象是否可变与被复制的对象保持一致。
        
    //copy:对于可变对象为深拷贝,引用计数不改变;
        //对于不可变对象是浅拷贝,引用计数每次加一。
        //始终返回一个不可变对象。
        //NSString一般建议用copy,这样再更改数据不影响原来的赋值
    
    //mutableCopy:始终是深拷贝,引用计数不改变。
        //始终返回一个可变对象。
        
        
        
    //    二:浅拷贝与深拷贝的区别
        
        //浅拷贝的定义: 就是复制对象的值的时候,不管复制多少,所以的值都指向同一个对象.
        //深拷贝的定义: 增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存.
        
        
        
        //浅拷贝 是指针拷贝, 深拷贝 是内容拷贝.
        
        //举例    浅拷贝: 一个人一开始叫张三,后来改名叫李四了,可是还是同一个人.相互影响.
        //           深拷贝: 一个人一开始叫张三,后来克隆个人叫李四,不是同一个人.不会相互影响.
        
        //    1. 当然在ios中并不是所有的对象都支持copy,mutableCopy,遵守NSCopying 协议的类可以发送copy消息,遵守NSMutableCopying 协议的类才可以发送mutableCopy消息。
        //    2. 如果想自定义一下copy 那么就必须遵守NSCopying,并且实现 copyWithZone: 方法,如果想自定义一下mutableCopy 那么就必须遵守NSMutableCopying,并且实现 mutableCopyWithZone: 方法。
    
        
        
    //    三. ios提供了copy和mutablecopy方法,copy就是复制了一个不可变的对象,而mutablecopy就是复制了一个可变的对象.
        
     //1. 对于非容器类对象的拷贝.(NSString, NSNumber等)
        //对于一个不可变对象的拷贝:
    //   NSString *str1 = [[NSString alloc] initWithFormat:@"bingbingbing"];
    //    NSString *str2 = [str1 copy];
    //    NSMutableString *str3 = [str1 mutableCopy];
    //    NSLog(@"%p, %p, %p", str1, str2, str3);
    //    NSLog(@"%lu, %lu, %lu",str1.retainCount, str2.retainCount, str3.retainCount);
    //    [str1 release];
    //  NSLog(@"%p, %p, %p", str1, str2, str3);
    //    NSLog(@"%lu, %lu, %lu",str1.retainCount, str2.retainCount, str3.retainCount);
    
     //如果对一不可变对象复制,copy是浅拷贝, mutableCopy就是深拷贝。
    
        
        //对于一个可变对象的拷贝:
    //    NSMutableString *string1 = [[NSMutableString alloc] initWithFormat:@"冰冰"];
    //    NSString *string2 = [string1 mutableCopy];
    //    NSMutableString *string3 = [string1 mutableCopy];
    //    NSMutableString *string4 = [string1 copy];
    //    NSLog(@"%p, %p, %p, %p", string1, string2, string3, string4);
    //    NSLog(@"%lu, %lu, %lu, %lu", string1.retainCount, string2.retainCount, string3.retainCount, string4.retainCount);
    
    //如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。
        
        
        //2. 对容器类对象的拷贝.(NSArray, NSDictionary等)
    
    //    
    //    NSArray *arr1 = [NSArray arrayWithObjects:@"bing", @"liang", nil];
    //    NSArray *arr2 = [arr1 copy];
    //    NSMutableArray *arr3 = [arr1 mutableCopy];
    //    NSLog(@"%p, %p, %p", arr1, arr2, arr3);
    //    NSLog(@"%lu, %lu, %lu", arr1.retainCount, arr2.retainCount, arr3.retainCount);
        //arr1是和arr2指向相同的对象,里面的元素也是指向相同的指针,
        //这里arr2 是对 arr1 的浅拷贝, arr3 是对 arr1 的深拷贝.
    //    for (NSString *p in arr1) {
    //        NSLog(@"%p",p);
    //    }
    //    NSLog(@"_________________________________");
    //    for (NSString *p in arr2) {
    //        NSLog(@"%p",p);
    //    }
    //    NSLog(@"_________________________________");
    //    for (NSString *p in arr3) {
    //        NSLog(@"%p",p);
    //    }
        //但是数组里的元素都是浅拷贝.
        
       /*
         NSMutableString *mutabelString1 = [NSMutableString stringWithFormat:@"bingbing"];
         NSMutableString *mutabelString2 = [NSMutableString stringWithFormat:@"laingliang"];
    */
        NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"bingbing", @"laingliang", nil];
        NSArray *array2 = [array1 copy];
        NSMutableArray *array3 = [array1 mutableCopy];
        NSMutableArray *array4 = [array1 copy];
        NSLog(@"%p, %p, %p, %p", array1, array2, array3, array4);
        NSLog(@"%lu, %lu, %lu, %lu", array1.retainCount, array2.retainCount, array3.retainCount, array4.retainCount);
        
        
        //如果容器的某一元素是不可变的,那你复制完后该对象仍旧是不能改变的,因此只需要指针复制即可。
    //        for (NSString *p in array1) {
    //            NSLog(@"%p",p);
    //        }
    //    NSLog(@"_________________________________");
    //        for (NSString *p in array2) {
    //            NSLog(@"%p",p);
    //        }
    //    NSLog(@"_________________________________");
    //        for (NSString *p in array3) {
    //            NSLog(@"%p",p);
    //        }
    //    NSLog(@"_________________________________");
    //       for (NSString *p in array4) {
    //            NSLog(@"%p",p);
    //    }
        
        
        //copy 和 retain 的区别 :
        //在Foundation对象中,当copy是一个不可变的对象时,作用相当于retain, 都是浅拷贝.
        //当是一个 可变对象时, copy 是深拷贝, retain 是浅拷贝.
        
        //copy 和 MutableCopy 的区别 :
        //在Foundation对象中,copy是一个不可变的对象时,浅拷贝.
        //当我们使用copy一个可变对象时, 深拷贝, 但是副本对象是不可变的.
        //当使用mutableCopy时,不管原对象是否可变,副本是可变的,并且实现真正意义上的深拷贝.
        
    
        
        //3. 对象的 自定义拷贝:
        //深拷贝和浅拷贝的区别就在于copyWithZone方法的实现(略)
        // 浅拷贝 复制对象本身,对象里的属性、包含的对象不做复制
        // 深拷贝 复制全部,包括对象的属性和其他对象
    
        return 0;
    }
  • 相关阅读:
    docker学习之network:初识网络配置
    原来:HTTP可以复用TCP连接
    git tag的用法及意义
    Android,社招,面淘宝,指南【内部人员为你保驾护航】
    别了,拼多多!再也不想砍一刀了,哔哩哔哩 (゜-゜)つロ 干杯~
    【Android面试宝典】2021年,腾讯等大厂Android高级开发面试完全攻略!
    腾讯40岁老兵现身说法:35岁职业生涯分水岭,架构or管理,到底怎么选?
    【整理合集】Flutter 常用第三方库、插件、学习资料等
    [PAT]1011 World Cup Betting (20 分)Java
    [PAT] 1010 Radix (25 分)Java
  • 原文地址:https://www.cnblogs.com/wohaoxue/p/4819829.html
Copyright © 2020-2023  润新知