又是一个老生常谈的话题,可是貌似这个问题,好多ios开发工程师并不能理解透彻,所以简单记录分析一下深复制与浅复制的原理以及strong,copy修饰符的原理和使用。


 
一、深复制与浅复制
 
    1、区分深复制与浅复制其实很简单,最直观的一点就是是否创建了新的对象(或者说副本)。(这里说的是内容是否被copy)。浅复制只是引用计数加一,没有创建新的对象;深复制直接把内容复制,创建了新的对象。
    2、不同情况下的copy和mutablecopy是否会创建新的对象
        1》深拷贝:如果建立出新的副本,在内存中有两个对象.就是深拷贝.
            可变 -> 不可变 (copy)  
            可变 -> 可变 (mutableCopy)
            不可变 -> 可变 (mutableCopy)
        2》浅拷贝:不会建立新的副本, 只是引用计数加1.
            不可变 -> 不可变  (因为两个不可变对象谁都不会被改变,也就没必要建立副本)
        小结:[object1 doCopy]   objec1 和 docopy 有一个是带mutable的就会产生新的对象(docopy指的是copy或者            
                    mutablecopy)
 
二、strong,copy修饰符的区别
 
    这个有点老生常谈了,很简单的一个问题
    copy修饰符:对 “=” 右边的对象先release,然后copy一份赋值给“=”左边的对象。
    strong修饰符:对 “=” 右边的对象先release,然后直接retain,引用计数加一,赋值给“=”左边的对象。
    举例说明:
            
//cMArr 是由copy修饰的,所以在赋值时其实是把[mmArr mutableCopy] 执行copy之后的结果赋值给了cMArr,这时结果其实是一个NSArray类型(可变数组copy之后生成新对象,新对象为不可变数组)
//sMArr 是由strong修饰,赋值时相当于是对右边的对象先release再retain,直接引用计数加一,并没有创造新的对象,所以sMArr 和mmArr指向同一内存区
@property(copy,nonatomic) NSMutableArray *cMArr;
@property(strong,nonatomic) NSMutableArray *sMArr;
 
NSMutableArray *mmArr = [@[@"111",@"222"] mutableCopy];
    self.cMArr = [mmArr mutableCopy];
    self.sMArr = mmArr;
    NSLog(@"\nmmArr = %p %@, \ncmArr = %p %@,\nsmArr = %p %@",mmArr,[mmArr class],self.cMArr,[self.cMArr class],self.sMArr,[self.sMArr class]);
 
三、copy,strong修饰符使用习惯
    1》copy修饰不可变类型,这样赋值的时候每次都要对右边的对象copy一次,确保内容的独立性。
    2》strong修饰可变类型,赋值时直接对等号右边进行引用计数加一,当然等号右边要是不可变类型,代码mutablecopy之后再赋值。
    3》strong修饰不可变类型,如果等号右边是可变类型会出现赋值之后等号左边内容是可变类型的情况,当然可以赋值前代码copy一下避免这个问题(慎用,谨防忘记代码copy然后才能赋值)
    4》copy修饰可变类型,每次赋值都对等号右边进行一次copy,最终结果只能是不可变类型(禁用)
 
 
 
另一篇博客中,具体分析了一个特例数组的各种情况,点击这里查看
 
 
 

深复制与浅复制&&strong,copy修饰符总结的更多相关文章

  1. iOS 集合的深复制与浅复制

    概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制 ...

  2. python 深复制和浅复制

    https://www.python-course.eu/python3_deep_copy.php-------------------------------------------------- ...

  3. Python学习日记之字典深复制与浅复制

    Python中通过copy模块有两种复制(深复制与浅复制) copy 浅复制 复制时只会复制父对象,而不会复制对象的内部的子对象. deepcopy 深复制 复制对象及其子对象 因此,复制后对原dic ...

  4. js中的深复制与浅复制

    前言 所谓深复制与浅复制(深拷贝与浅拷贝),乍一听感觉听高大上,像是一个非常难理解的概念,其实我们平常项目开发都是在用的,只是你可能不知道该怎么叫它的名字而已,就像你听熟了一首歌,就是不知道这首歌叫什 ...

  5. .Net深复制、浅复制

    在.Net,大家都知道引用类型的深复制.浅复制吧. ,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制.若ob ...

  6. C++学习基础七——深复制与浅复制

    一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深 ...

  7. php对象当参数传递 && php深复制和浅复制

    把对象当参数传递给方法,在方法里改过对象后,影响到外面的对象  因为对象是引用传递过去的 class Book { public $name; public function __construct( ...

  8. Java中对象的深复制和浅复制详解

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...

  9. Java中的深复制与浅复制

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...

随机推荐

  1. 利用ligerUI隐藏某列,并不产生空白列的方法

    var grid;//声明变量 $(function () { //grid初始化 grid = $("#maingrid4").ligerGrid({ columns: [ { ...

  2. From Alpha to Gamma (II)

    这篇文章被拖延得这么久是因为我没有找到合适的引言 -- XXX 这一篇接着讲Gamma.近几年基于物理的渲染(Physically Based Shading, 后文简称PBS)开始在游戏业界受到关注 ...

  3. 【Cocos2d-Js基础教学(1)JS -Mac配置篇】

    一.准备工作 Windows配置篇请见 http://cn.cocos2d-x.org/tutorial/show?id=1396 1.安装python 2.下载Android SDK Android ...

  4. POI(java 操作excel,word等)编程

    一.下载所需jar包 下载地址:http://poi.apache.org/download.html http://download.csdn.net/detail/likai22/534250 二 ...

  5. 获取分组后统计数量最多的纪录;limit用法;sql执行顺序

    CREATE TABLE emp(id INT PRIMARY KEY,NAME VARCHAR(11),dep_id INT ,salary INT); CREATE TABLE dept(id I ...

  6. Segment Tree-732. My Calendar III

    Implement a MyCalendarThree class to store your events. A new event can always be added. Your class ...

  7. 详述MySQL服务在渗透测试中的利用

    本文作者:i春秋签约作家——Binghe 致力于书写ichunqiu社区历史上最长篇最细致最真实的技术复现文章. 文章目录: MySQL之UDF提权 MySQL之MOF提权 MySQL之常规写启动项提 ...

  8. 主机安全扫描工具-- vuls

    https://vuls.io/ 一. 安装 系统管理员有责任定期去检查系统的弱点和更新软件, vuls 可以提供如下功能: 通知管理员机器有安全隐患 支持本地和远程扫描(需要有 ssh 权限) 可以 ...

  9. php批量导出pdf文件的脚本(html-PDf)

    背景:突然有大量的文件需要导出成PDF文件,写一个批量导出pdf的脚本,同时文件的命名也需要有一定的规则 导出方式:向服务器中上传csv文件,csv文件中包含文件的地址和相对应的文件命名. 如下格式: ...

  10. 转的很好的js 入门

    JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.( ...