美文网首页
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基本使用(深浅拷贝)

    pragma mark Copy基本使用(深浅拷贝) pragma mark 概念 pragma mark 代码

  • 第08天OC语言(17):Copy基本使用(深浅拷贝)

    不要等到明天,明天太遥远,今天就行动。 须读:看完该文章你能做什么? Copy的基本概念 学习前:你必须会什么?(...

  • OC中的深浅拷贝

    我们从3种类型的对象来分析一下OC的深浅拷贝 系统非容器类型的对象(以string来举例) 不可变类型 NSStr...

  • OC语言基本概念

    基本概念 oc面向对象语言,只需关注具有相关功能的对象,不必亲力亲为。 oc面向对象的三大特性:封装、继承(拷贝一...

  • Copy基础理解(一)

    关于oc深浅拷贝问题可能做过ios开发的都有了解到,尤其是面试特别喜欢问深浅拷贝的问题.但大多有点误区,即便是有几...

  • Copy & MutableCopy

    copy&mutableCopy介绍   copy和mutableCopy,深浅拷贝,在OC里面是两个协议方法NS...

  • 2018-08-29

    深浅拷贝 1.根据拷贝内容的不同,分为深浅拷贝 深拷贝:内容...

  • OC由浅入深系列 之 深浅拷贝

    一、什么是深拷贝,浅拷贝? 在堆中产生一个副本的拷贝操作称为深拷贝,在栈中声名一个指针指向对象的堆地址称为浅拷贝。...

  • Cpp8 运算符重载和深浅拷贝

    Cpp8 运算符重载和深浅拷贝 深浅拷贝 相同类型间可以直接拷贝 我们发现使用=直接赋值对象,编译器自动生成了op...

  • 献给Objective-C的初学者--入门篇(三)认识OC数据类

    前面说过OC是兼容C语言的语法的,同样C语言的基本数据类型在OC中照样可以使用。C语言的基本类型,这里就不再赘述了...

网友评论

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

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