美文网首页
OC语言day08-17Copy基本使用(深浅拷贝)

OC语言day08-17Copy基本使用(深浅拷贝)

作者: liyuhong165 | 来源:发表于2016-09-04 19:10 被阅读26次

    pragma mark Copy基本使用(深浅拷贝)

    pragma mark 概念

    /**
     一、copy基本概念
     1.什么是copy
        copy的字面意思 “复制”、“拷贝” 是一个产生副本的过程
     2.常见的复制有: 文件复制
        作用: 利用一个 源文件 产生一个副本文件
     特点:
        修改源文件的内容,不会影响副本文件
        修改副本文件的内容, 不会影响文件
     
     OC中的copy
        作用:利用一个源对象 产生一个副本对象
     特点:
        修改源对象的 属性 和 行为, 不会影响 副本对象
        修改副本对象的 属性 和 行为, 不会影响 源对象
     
     二、copy的使用
     如何使用copy功能
        一个对象 可以调用copy 或者 mutableCopy 方法创建一个副本对象
        copy: 创建的是 不可变副本 (如:NSString、NSArray、NSDictionary)
        mutableCopy: 创建的是 可变副本(如:NSMutableString、NSMutableArray、NSMutableDictionary)
     
     使用copy功能的前提
        copy: 需要遵守 NSCopying协议,实现copyWithZone方法
     @protocol NSCopying
     - (id)copyWithZone:(NSZone *)zone;
     @end
     
     使用mutableCopy的前提
        需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法
     @protocol NSMutableCopying
     - (id)mutableCopyWithZone:(NSZone *)zone;
     @end
     
     三、深复制、浅复制 
     (一句话  不可变 对 不可变 进行 copy 不产生新的对象 是浅拷贝)
     (其他的 都会产生 新的对象 所以 都是深拷贝 )
     
     ---------------
     (1....)浅复制 (浅拷贝,指针拷贝、shallow copy)
        源对象 和 副本对象都是 同一个对象
        源对象 (副本对象) 引用计数器 +1 , 相当于 做了 retain操作
        本质 : 没有产生新的对象
    代码 不可变 对 不可变 进行 copy
     NSString *srcStr3 = @"lyhhh";
     NSString *copyStr3 = [srcStr3 copy];
     NSLog(@"4.浅拷贝 ---- %p,%p",srcStr3, copyStr3);
     
     
     ---------------
     (2....)深复制 (深拷贝、内存拷贝、deep copy)
        源对象 和 副本对象是不同的两个对象
        源对象 引用计数器 不变 , 副本对象计数器 + 1   (因为是新产生的对象 )
        本质 : 产生了新的对象
     
     代码1 不可变 对 可变 进行 mutableCopy
     
     NSString *srcStr = @"lyh";
     NSMutableString *copyStr = [srcStr mutableCopy];  // 调用 mutableCopy 会产生 一个 NSMutableString
     NSLog(@"srcStr = %@,copyStr = %@",srcStr,copyStr);
     NSLog(@"%p,%p",srcStr, copyStr);
     NSLog(@"--------");
     
     代码2 可变 对 可变 进行 mutableCopy
     NSMutableString *srcStr1 = [NSMutableString stringWithFormat:@"lyh"];
     NSMutableString *copyStr1 = [srcStr1 mutableCopy];
     [srcStr1 appendString:@" cool"];
     NSLog(@"srcStr1 = %@,copyStr1 = %@",srcStr1,copyStr1);
     NSLog(@"%p,%p",srcStr1, copyStr1);
     NSLog(@"--------");
     
     代码3 可变 对 不可变 进行 copy
     NSMutableString *srcStr2 = [NSMutableString stringWithFormat:@"lyh"];
     NSString *copyStr2 = [srcStr2 copy];
     [srcStr2 appendString:@" cool"];
     NSLog(@"srcStr2 = %@,copyStr2 = %@",srcStr2,copyStr2);
     NSLog(@"%p,%p",srcStr2, copyStr2);
     NSLog(@"--------");
     */
     
    

    pragma mark 代码

    #import <Foundation/Foundation.h>
    #pragma mark 类
    
    #pragma mark main函数
    int main(int argc, const char * argv[])
    {
    #pragma Copy基本使用(深浅拷贝)
    #pragma mark 深拷贝
    #warning 1.
        // 会生成一个新的对象
        NSString *srcStr = @"lyh";
        // 只要是 拷贝出来的对象, 拷贝出来的对象 的内容 和 以前对象中的内容一致
        // "一般"情况 拷贝会生成一个新的对象
        // 为什么会产生 一个新的对象 1.因为 拷贝 要求修改原来的对象 不能影响到 拷贝出来的对象 \
                                    修改拷贝出来的对象 也不能影响到 原来的对象, 所以需要生成 一个新的对象 \
                                 2. 由于 以前的对象 是 一个不可变的对象, 而通过mutableCopy 拷贝出来的对象 必须 是一个可变的对象,所以必须生成一个新的对象
        NSMutableString *copyStr = [srcStr mutableCopy];  // 调用 mutableCopy 会产生 一个 NSMutableString
        NSLog(@"srcStr = %@,copyStr = %@",srcStr,copyStr);
        NSLog(@"%p,%p",srcStr, copyStr);
        NSLog(@"--------");
    
        
    #warning 2.
        // 会生成一个新的对象
        NSMutableString *srcStr1 = [NSMutableString stringWithFormat:@"lyh"];
        NSMutableString *copyStr1 = [srcStr1 mutableCopy];
        [srcStr1 appendString:@" cool"];
        NSLog(@"srcStr1 = %@,copyStr1 = %@",srcStr1,copyStr1);
        NSLog(@"%p,%p",srcStr1, copyStr1);
        NSLog(@"--------");
    
        
    #warning 3.
        // 会生成一个新的对象
        NSMutableString *srcStr2 = [NSMutableString stringWithFormat:@"lyh"];
        NSString *copyStr2 = [srcStr2 copy];
        [srcStr2 appendString:@" cool"];
        NSLog(@"srcStr2 = %@,copyStr2 = %@",srcStr2,copyStr2);
        NSLog(@"%p,%p",srcStr2, copyStr2);
        NSLog(@"--------");
        
    #pragma mark 浅拷贝
    #warning 4.
        /**
         正是 因为调用copy方法有时候会生成 一个新的对象, 有时候不会生成 一个新的对象
         所以 : 如果没有生成 新的对象 , 我们称之为 浅拷贝, (本质 就是 指针拷贝)
               如果生成了新的对象, 我们陈志伟 深拷贝 , 本质就是 会创建一个新的对象
         
         */
        // 如果是 通过 不可变对象 调用了 copy, 那么不会生成一个新的对象
        // 原因: 因为 原来的对象 是不能修改的, 拷贝出来的对象 也是不能修改的
        // 既然 两个都不能修改, 所以 永远不能影响到 另外一个对象, 那么已经符合需求了
        
        // 所以 : OC为了对 内容进行优化, 就不会生成一个新的对象
        NSString *srcStr3 = @"lyhhh";
        NSString *copyStr3 = [srcStr3 copy];
        NSLog(@"4.浅拷贝 ---- %p,%p",srcStr3, copyStr3);
    
    
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:OC语言day08-17Copy基本使用(深浅拷贝)

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