一、深拷贝和浅拷贝

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

二、对于 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 5776 sum

    猜了一下,发现对了.n>m是一定有解的.所以最多m*m暴力,一定能找到.而T较小,所以能过. #pragma comment(linker, "/STACK:1024000000,10 ...

  2. 按钮特效-Enter键自动提交表单

    —————————————————————— <script type="text/javascript">                        //当用户按 ...

  3. how to download image from any web page in java 下载图片

    http://stackoverflow.com/questions/5882005/how-to-download-image-from-any-web-page-in-java (throws I ...

  4. 读书有感——《从毕业生到程序员使用C#开发商业软件》

    本来想自己写个读书感悟之类的东西,但是苦于自己语文水平太差,算了,我把里面觉得很赞的内容摘抄下来就好了(学习都是从模仿开始的嘛). 书籍:<从毕业生到程序猿使用C#开发商业软件> 作者:袁 ...

  5. Spring Security3实现,权限动态获取

    Spring Security3实现,权限动态获取 原文  http://blog.csdn.net/yangwei19680827/article/details/9359113 主题 网络安全Sp ...

  6. MySQL 出现 The table is full 的解决方法【转】

    [MySQL FAQ]系列 — 你所不知的table is full那些事 时间 2014-08-21 12:18:56  MySQL中文网 原文  http://imysql.com/2014/08 ...

  7. MySQL主从配置【转载】

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

  8. Linq List<String>

    List<string> _year = new List<string>() { "一月", "二月", "三月" ...

  9. 设计模式二 适配器模式 adapter

    适配器模式的目的:如果用户需要使用某个类的服务,而这项服务是这个类用一个不同的接口提供的,那么,可以使用适配器模式为客户提供一个期望的接口.

  10. rebar

    www.cnblogs.com/panfeng412/archive/2011/08/14/2137990.html