一、数组的不同情况下的copy,mutablecopy分析

  1.不可变数组的copy(没有创建新对象,复制的只是指针)
 
 
 
  2.不可变数组的mutable copy(创建新对象)
 
 
  3.可变数组的copy(创建新对象)
 
 
  4.可变数组的mutable copy(创建新对象)
 
 
 

 二、“=”运算符

  “=”的作用(“=” 运算符只是让左边的指针指向右边指针指向的内存区域,如果需要左边的指针指向新的内存区,必须要在右边进行新对象的创建,即在“=”右边使用copy,mutablecopy,new等来创建新对象)

 

三、修饰符strong,copy

  strong修饰的属性赋值时对“=”右边的property先release再retain,引用计数加一而已;

  copy修饰符对“=”右边的property先release再copy

 
由于遵循上面的原理,看看我对代码的理解:
//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]);
打印结果:
 
 
 
用法总结:

   1》copy修饰不可变类型,这样赋值的时候每次都要对右边的对象copy一次,确保内容的独立性。

    2》strong修饰可变类型,赋值时直接对等号右边进行引用计数加一,当然等号右边要是不可变类型,代码mutablecopy之后再赋值。
    3》strong修饰不可变类型,如果等号右边是可变类型会出现赋值之后等号左边内容是可变类型的情况,当然可以赋值前代码copy一下避免这个问题(慎用,谨防忘记代码copy然后才能赋值)
    4》copy修饰可变类型,每次赋值都对等号右边进行一次copy,最终结果只能是不可变类型(禁用)
 

 
其实本文记录的只是深复制和浅复制的一个特例而已,搞懂了深复制和浅复制,无论是数组还是字典亦或是字符串都会很通透的。
我的另一篇关于深复制和浅复制的文章和本文应该也是殊途同归

前四张图片借用文档:http://blog.csdn.net/frankisbaby/article/details/54946115

 
 

数组的strong copy理解的更多相关文章

  1. OC中@property属性关键字的使用(assign/weak/strong/copy)

    OC中@property属性关键字的使用(assign/weak/strong/copy) 一.assign 用于 ‘基本数据类型’.‘枚举’.‘结构体’ 等非OC对象类型 eg:int.bool等 ...

  2. C语言教学--二维数组和指针的理解

    对于初学者对二维数组和指针的理解很模糊, 或者感觉很难理解, 其实我们和生活联系起来, 这一切都会变得清晰透彻. 我们用理解一维数组的思想来理解二维数组, 对于一维数组,每个箱子里存放的是具体的苹果, ...

  3. 【学习笔记】Tensor多维数组和axis的理解

    Tensor多维数组和axis的理解 今天在编写程序的时候一直对于axis=0或等于1搞不明白,这样对于整个numpy或者是tensorflow的基本运算和数据处理都会很模糊,所以花了一些时间来搞清楚 ...

  4. C语言数组和指针的理解_在取地址运算上的操作_指针加减操作_a 和&a 的区别

    1.一个实例+理论分析 在了解数组和指针的访问方式前提下,下面再看这个例子: main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); pr ...

  5. 字符串、数组操作函数 Copy Concat Delete Insert High MidStr Pos SetLength StrPCopy TrimLeft

    对字符串及数组的操作,是每个程序员必须要掌握的.熟练的使用这些函数,在编程时能更加得心应手. 1.Copy 功能说明:该函数用于从字符串中复制指定范围中的字符.该函数有3个参数.第一个参数是数据源(即 ...

  6. 差异:后缀数组(wzz模板理解),单调栈

    因为涉及到对模板的理解,所以就着代码看会好一些. 让那些坚决不颓代码的人受委屈了. 我是对着wzz的板子默写的,可能不完全一样啊. 还有代码注释里都是我个人的理解,不保证正确,但欢迎指正. 可以有选择 ...

  7. PHP JSON数组与对象的理解

    在PHP后端和客户端数据交互的过程中,JSON数据中有时格式不定,一会儿是数组,一会儿是对象,弄得客户端开发人员要崩溃的感觉. 因此,前后端相关人员先对PHP的json_encode函数原理有必要的了 ...

  8. (实用篇)PHP JSON数组与对象的理解

    在PHP后端和客户端数据交互的过程中,JSON数据中有时格式不定,一会儿是数组,一会儿是对象,弄得客户端开发人员要崩溃的感觉. 因此,前后端相关人员先对PHP的json_encode函数原理有必要的了 ...

  9. c数组和指针的理解

    #include<stdio.h> int main(void) { ,,,,}; ); printf(,*(p-)); // ] = &a; √ // ] = a; × // ] ...

随机推荐

  1. Unity的Shader如何控制投影颜色

    细节慢慢补充,有几个需要注意的地方,必须要有接收投影的pass也就是Name是ShadowCollector的,必须添加#pragma multi_compile_fwdbase,物体的着色器必须有T ...

  2. myeclipse注册码生成

    import java.io.*; /** * <一句话功能简述> * <功能详细描述> * * @author 程松 * @date 2013-11-8上午8:50:34 * ...

  3. [微信小程序]——bug记录

    记录日常开发小程序遇到的一些小问题: input 输入框(unfixed) 描述:输入框focus的时候,placeholder会往上面跳动一下 当 scroll-view 遇上 fixed 描述:给 ...

  4. 【wireshark】开发环境搭建

    1. 引言 本文相关内容可参考Wireshark开发指南第2章”Quick Setup” 要对wireshark代码进行修改,除了下文介绍的lua插件的方式以外,都需要对wirehshark源码进行编 ...

  5. 如何修改静态IP地址和动态IP地址

    打开控制面板,一般在电脑的菜单栏能找到,win8和win10可以使用快捷键(win键+X键),找不到的朋友可以搜索一下.   进入到网络和共享中心,点击更改适配器设置.   这里显示的是电脑所以的网络 ...

  6. java解压缩.gz .zip .tar.gz等格式的压缩包方法总结

    1..gz文件是linux下常见的压缩格式.使用 java.util.zip.GZIPInputStream即可,压缩是 java.util.zip.GZIPOutputStream public s ...

  7. pythonweb框架Flask学习笔记04-模板继承

    # -*- coding:utf-8 -*- from flask import render_template,Flask app=Flask(__name__) @app.route('/hell ...

  8. 调用百度地图开发平台的JavascriptAPI实现将市县位置转换成坐标

    最近的项目要做的地图比较多,有的还比较复杂,而地图用到的坐标,上网找json文件更是良莠不齐的.真是让人伤脑筋,后来突然想到了百度地图开发平台,没想到真的有对应的API哦,谢天谢地!!!下面说一下完整 ...

  9. vmware安装——CentOS-6.5和Mysql

    1.新建虚拟机 2.安装centos6.5 3.centos设置 查看网络 4.vmware设置网络连接 关闭selinux [root@china ~]# vim /etc/selinux/conf ...

  10. ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...

    Struts2未配置Log4j2.xml报错 Log4j2.xml中的配置 log4j的jar包:log4j-core-2.7.jar log4j2只支持xml和json两种格式的配置,所以配置log ...