• oc中深拷贝与浅拷贝


                  shallow 浅拷贝       Deep深拷贝  

    1、产生一个新对象,对象的内容与源对象相同

    2、源对象与新对象使用不同的内存区域

    3、需要NSCopying 或者NSMutableCopying协议才能使用复制功能

    4、Fundation中得基础数据类型如Nsstring、NSNumber 等都实现了NSCopying

    5、新对象的引用计数为1

    6、copy与mutableCopy的区别

            copy返回不可变对象(包括可变对象在内)

          ​ mutableCopy返回可变对象

    7、浅拷贝只复制对象本身,而不会复制对象引用的其他对象

    8、深拷贝除了复制对象本身,还会复制对象所引用的其他对象

    9、Foundation框架里支持拷贝的类,默认是浅拷贝

     

    retain:始终是浅复制。引用计数每次加一。返回对象是否可变与被复制的对象保持一致。

     

    copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,

             引用计数每次加一。始终返回一个不可变对象。

     

    mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象。

     

    不可变对象:值发生改变,其内存首地址随之改变。

       可变对象:无论值是否改变,其内存首地址都不随之改变。

       引用计数:为了让使用者清楚的知道,该对象有多少个拥有者(即有多少个指针指向同一内存地址)。

     最近有一个好朋友问我,什么时候用到深浅复制呢?那么我就把我所总结的一些分享给大家,希望能帮助你们更好的理解深浅复制!

     

    那么先让我们来看一看下边数组类型的转换

    1、不可变对象→可变对象的转换:

           NSArray *array1= [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];

           NSMutableArray  *str2=[array1 mutableCopy];

    2、可变对象→不可变对象的转换:

        NSMutableArray *array2   = [NSMutableArray arrayWithObjects:@"aa",@"bb",@"cc",@"dd",nil];

           NSArray *array1=[  array2    Copy];

    3、可变对象→可变对象的转换(不同指针变量指向不同的内存地址)

           NSMutableArray *array1= [NSMutableArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];

           NSMutableArray  *str2=[array1 mutableCopy];

    通过上边的两个例子,我们可轻松的将一个对象在可变和不可变之间转换,并且这里不用考虑内存使用原则(即引用计数的问题)。没错,这就是深拷贝的魅力了。

    4、同类型对象之间的指针复制(不同指针变量指向同一块内存地址):

      a、

       NSMutableString *str1=[NSMutableString stringWithString:@"two day"];

       NSMutableString *str2=[str1   retain];

       [str1  release];

      b、

       NSArray *array1= [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];

       NSArray  *str2=[array1 Copy];

       [array1 release];

     

       通俗的讲,多个指针同时指向同一块内存区域,那么这些个指针同时拥有对该内存区的所有权。所有权的瓜分过程,这时候就要用到浅拷贝了。

  • 相关阅读:
    MyBatis入门(一)—— 入门案例
    Spring Boot统一异常处理方案示例
    Centos7 安装 ActiveMq
    在 CentOS7 上安装 zookeeper-3.5.2 服务
    使用Homebrew安装Git与Github在idea中的配置
    iReport(模版) 与Jasper(数据填充)生成pdf文档
    SSH下shiro的基本使用
    FastJson的忽略字段和格式日期用法
    Quartz —— 任务调度框架
    POI操作Excel
  • 原文地址:https://www.cnblogs.com/liuxiang520/p/3876679.html
Copyright © 2020-2023  润新知