一、数组的不同情况下的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. C++实现排序算法

    稳定性:快速 希尔 选择 堆排序不稳定 时间复杂度:平均情况下,快速.希尔.归并和堆排序的时间复杂度均为O(nlog2(n)),其他都是O(n^2).最坏情况下,快排的时间复杂度为O(n^2) #in ...

  2. for循环、for in整理

    for循环 作用:按照一定的规律,重复去做某件事情,此时我们就需要使用循环来处理了 例子1:倒着输出每一项 <script type="text/javascript"> ...

  3. “全栈2019”Java多线程第二十七章:Lock获取lock/释放unlock锁

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. LayUI把表格中的时间戳改成格式化的时间

  5. window主机和centos主机之间相互传送文件

    命令实现linux和window文件传送 一:下载配置pscp软件从http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html下载p ...

  6. 匹配img标签的正则表达式

    $preg = '/<img.*?src=[\"|\']?(.*?)[\"|\']?\s.*?>/i';//匹配img标签的正则表达式 preg_match_all($ ...

  7. git修改文件权限方式

    查看Repository中文件权限 git ls-tree HEAD 100644 blob 018321abfbff52d175a788597f5b5f3f17f67dc7 .gitignore 1 ...

  8. react native 学习之 native modules

    翻译自https://facebook.github.io/react-native/docs/native-modules-ios.html Native Modules 很多情况下,app需要使用 ...

  9. [JavaScript] 获取昨日前天的日期

    var day = new Date(); day.setDate(day.getDate()-1); console(day.pattern('yyyy-MM-dd'));//昨天的日期 day.s ...

  10. 编写一致的符合习惯的javascript

    本文转自我司的编码规范~ ==== 引言 将要叙述的这些原则旨对javascript开发的风格做指导,并非指定性的规则需绝对服从.如果需要找出一条必须遵循的原则,应该是保持代码的一致性和风格统一. 除 ...