一、深拷贝和浅拷贝

  • 深拷贝:对象拷贝 - 直接拷贝内容。
  • 浅拷贝:指针拷贝 - 将指针中的地址值拷贝一份。

二、对于 Copy 与 mutableCopy 的实践
  • 思路:我用四个方案来验证 Copy 与 mutableCopy 的区别。
  • 方案:

    • 方案一:copy不可变的字符串

      NSString*str = @"aaa";
      NSString*copyStr = [str copy];
      NSLog(@"str = %p copyStr= %p",str,copyStr);
      NSLog(@"指针地址:str = %p copyStr= %p",&str,&copyStr);

      输出结果:str = 0x104d94068 copyStr= 0x104d94068
      指针地址:str = 0x7fff529e9aa8 copyStr= 0x7fff529e9aa0
      小结:对不可变的字符串的copy,我们对象的内存地址没有改变,只是指针的地址改变了,所以在这里我们默认进行了一次浅拷贝,只拷贝了指针。

    • 方案二:copy可变的字符串

      NSMutableString*str1 = [NSMutableString stringWithFormat:@"bbb"];
      NSString*copyStr1 = [str1 copy];
      NSLog(@"str1 = %p copyStr1 = %p",str1,copyStr1);
      NSLog(@"str1 = %p copyStr1= %p",&str1,&copyStr1);

      输出结果:str1 = 0x7fa522712cd0 copyStr1 = 0x7fa522717ba0
      指针地址:str1 = 0x7fff529e9a98 copyStr1= 0x7fff529e9a90
      小结:对可变字符串的copy,我们默认进行了一次深拷贝,直接拷贝了对象。

    • 方案三:mutableCopy不可变字符串的
      NSString*str2 = @"ccc";
      NSMutableString *copyStr2 = [str2 mutableCopy];
      NSLog(@"str2 = %p copyStr2 = %p",str2,copyStr2);

      输出结果:str2 = 0x10d216108 copyStr2 = 0x7fa522726290
      小结:对于不可变字符串的mutableCopy我们默认进行了深拷贝。

    • 方案四:mutableCopy可变字符串
      NSMutableString*str3 = [NSMutableString stringWithFormat:@"ddd"];
      NSMutableString*copyStr3 = [str3 mutableCopy];
      NSLog(@"str3 = %p copyStr3 = %p",str3,copyStr3);

      输出结果:str3 = 0x7fa5227153c0 copyStr3 = 0x7fa5227263f0
      小结:对于可变字符串的mutableCopy我们默认进行了深拷贝。


三、结论

    • copy:因为copy默认返回的是不可变的,所以当我们对一个不可变的字符串进行copy的时候,我们只是拷贝了它的指针(浅拷贝)。当我们对一个可变的字符串进行拷贝的时候,因为类型转变了,我们需对其进行深拷贝
    • mutableCopy:默认返回的是一个可变的对象,适用于可变的对象,例如NSMutableString,NSMutableArray,NSMutableDictionary、etc。 无论对于可变的字符串还是不可变的字符串进行mutableCopy,系统都默认进行深拷贝,那么为什么对于相同类型的进行mutableCopy返回的仍然是新的对象呢,因为在这里系统要保证,旧的对象和新的对象都是可变的,切他们之前不会相互影响。

Copy-->Mutable Copy的更多相关文章

  1. default constructor,copy constructor,copy assignment

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  2. Numpy copy & deep copy

    1. '='的赋值方式会带有关联性 >>> import numpy as np >>> a = np.arange(4) >>> b = a & ...

  3. python基础之赋值/深copy/浅copy

    首先,不管是赋值还是深浅copy,都是针对那些可能会产生变化的值进行区分的,也就是对于数字,字符串来说,区分赋值,深浅copy是毫无意义的. 那么,让我们来对那些可变的像list set dict t ...

  4. [C++] Deep copy ,Shallow copy, copy constructor,"="

    Deep copy ,Shallow copy, copy constructor,"=" Dog.h #pragma once class Dog { public: char ...

  5. 2 引用 深copy 浅copy

    1. is == 总结 is 是比较两个引用是否指向了同一个对象(引用比较). == 是比较两个对象是否相等. In [1]: a = [11,22,33] In [2]: b = [11,22,33 ...

  6. Numpy的学习6-深浅赋值(copy&deep copy)

    # = 的赋值方式会带有关联性 import numpy as np a = np.arange(4) # array([0, 1, 2, 3]) b = a c = a d = b # 改变a的第一 ...

  7. Objective-C 谈谈深浅拷贝,copy和mutable copy都不是完全拷贝

    (一)字符串中的指针赋值,copy和mutablecopy NSString和NSString (1)指针赋值 肯定指向同一个字符串地址. (2)copy(和直接指向一样) NSString *str ...

  8. 复制对象 copy 与mutable copy

      转载 :  http://blog.csdn.net/u010962810/article/details/18887841   通过copy方法可以创建可变对象或不可变对象的不可变副本,对于不可 ...

  9. ios retain copy 以及copy协议

    阅读本文之前首先了解Copy与Retain的区别: Copy是创建一个新对象,Retain是创建一个指针,引用对象计数加1. Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的 ...

  10. python学习笔记-(六)深copy&浅copy

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用. 1. 赋值 赋值其实只是传递对象引用,引用对象 ...

随机推荐

  1. hdu_5752_Sqrt Bo(xjb搞)

    题目链接:hdu_5752_Sqrt Bo 题意: 给你一个数,问你最少要开多少次方才能为1 题解: 我们发现如果给的数大于232 那么肯定在5次以内是开不出来的,所以直接输出TAT,然后小于的就模拟 ...

  2. hdu_4507_吉哥系列故事——恨7不成妻(鬼畜数位DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题意:中文,不解释,注意的是求的是合法数字的平方和,即(a+b+c+……)^2 题解:数位DP, ...

  3. flash/flex 编译错误汇总

    来源:http://blog.chinaunix.net/uid-366408-id-116463.html 代码 消息 说明   1000 对 %s 的引用不明确. 引用可能指向多项.例如,下面使用 ...

  4. .net项目svn项目管理文件清单

    You can add the following files to Visual Studio source control: Solution files (*.sln). Project fil ...

  5. ASP.NET 会话状态的模式

    ASP.NET 会话状态为会话数据提供了几个不同的存储选项.每个选项都通过一个 SessionStateMode 枚举值进行识别.如下列表中描述了可用的会话状态模式: InProc 模式:把会话状态存 ...

  6. MySQL主从配置【转载】

    1.主从服务器分别作以下操作:  1.1.版本一致  1.2.初始化表,并在后台启动mysql  1.3.修改root的密码 2.修改主服务器master:   #vi /etc/my.cnf     ...

  7. LinuxIP地址、网卡相关、克隆、VM

    改IP地址(#setup) 1.输入vi /etc/sysconfig/network-scripts/ifcfg-eth0 2.里面的内容修改为 DEVICE=eth0HWADDR=FC:4D:D4 ...

  8. fdisk添加磁盘

    1.            通过Fdisk查看系统分区详细信息: Fdisk –l   详解: [root@jetsenLin ~]# fdisk -l Disk /dev/sda: 10.7 GB, ...

  9. 【prim + kruscal 】 最小生成树模板

    来源:dlut oj 1105: Zhuo’s Dream Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 40 Solved: 14[Submit][St ...

  10. WPF(ContentControl和ItemsControl)

    WPF(ContentControl和ItemsControl) 2013-04-01 16:25 2188人阅读 评论(0) 收藏 举报  分类: .Net(C#)(31)  WPF(25)  版权 ...