一、数组的不同情况下的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. ovs-vsctl 命令详解

    Open vSwitch中有多个命令,分别有不同的作用,大致如下: ovs-vsctl用于控制ovs db ovs-ofctl用于管理OpenFlow switch 的 flow ovs-dpctl用 ...

  2. 768. Max Chunks To Make Sorted II

    This question is the same as "Max Chunks to Make Sorted" except the integers of the given ...

  3. 根据已有的Jar包 一键生成对应的mavenpom.xml信息

    根据已有的jar包信息一键生成对应的maven坐标信息 .想一个问题 假如 我有一个SSH的项目, jar包是配置在lib中, 我现在想把它做成maven格式的SSH项目  ,那么这些jar包在mav ...

  4. 在Load average 高的情况下如何鉴别系统瓶颈

    在Load average 高的情况下如何鉴别系统瓶颈.是CPU不足,还是io不够快造成? 或是内存不足? 一:查看系统负载vmstat procs -----------memory-------- ...

  5. 归并排序的理解和实现(Java)

    归并排序介绍 归并排序(Merge Sort)就是利用归并的思想实现的排序方法.它的原理是假设初始序列含有fn个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n2\fr ...

  6. Supporting Right-to-Left Languages

    For the most part iOS supports Right-to-Left (RTL) languages such as Arabic with minimal developer e ...

  7. Linux下面安装swoole

    需要安装php7 新建一个文件夹,作为存储swoole的文件夹 然后执行下面相对应的命令,这里是我执行的命令 新建文件夹 mkdir swoole 切入到文件夹中,进行下载安装包 wget http: ...

  8. 用Lingo求解线性规划问题

    第一步:输入目标条件和约束条件.每行以分号隔开.然后点击工具栏上的Solve按钮,或Lingo菜单下的Solve子菜单. 第二步:检查report中的结果. 默认情况下,Lingo不进行灵敏度分析. ...

  9. [转]Subdirectory Checkouts with git sparse-checkout

    From:http://jasonkarns.com/blog/subdirectory-checkouts-with-git-sparse-checkout/ If there is one thi ...

  10. 使用Topshelf部署Windows服务

    新建一个控制台应用程序,使用Nuget安装TopShelf: nuget Install-Package Topshelf 测试代码: 在Main中输入: //FileInfo fi = new Fi ...