一、深拷贝和浅拷贝

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

二、对于 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. ZOJ 2158 POJ 1789 Truck History

    最小生成树,主要是题目比较难懂. #include <cstdio> #include <cstring> #include <cmath> #include &l ...

  2. MySQL忘记密码解决办法

    一.windows下mysql忘记root密码的解决方法 详细出处参考:http://www.jb51.net/article/21984.htm 1,停止MYSQL服务,CMD打开DOS窗口,输入 ...

  3. VNC VIEWER的使用集锦

    关于颜色深度的问题, 今天用VNC Viewser ,连上去之后,发现色彩可能只有8或者16位 然后修改了 sever的depth,也不好使, 于是,就修改了 client的 colourlevel ...

  4. Cantor数表

    题目:现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 第一项是1/1,第二项是是1/2,第三项是2/1,第四项是3/1,第五项是2/2,… ...

  5. 手机版WEB开发经验分享,手机版网站开发注意事项,网站自适应,手机版网站自适应,移动安卓APP自适应

    转自 http://my.oschina.net/cart/blog/282477 做前端开发不短了,用过jQuery Mobile jqMobi 也纯手工写过.. 最后总结如下: jQuery Mo ...

  6. 启动apache服务时报错【the requested operation has failed】

    想要解决错误,首先要找到错误的原因. 使用ApacheMonitor.exe启动apache服务看不到任何错误的原因. 找到问题原因:cmd--命令端--切换到apache的bin目录,执行如下命令: ...

  7. XTEA加密算法

    XTEA加密算法 #include <stdint.h> /* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - ...

  8. 几种JAVA加密算法

    转自:http://www.cnblogs.com/mycodelife/archive/2009/04/22/1441624.html

  9. JS取非行间样式

    <title>无标题文档</title> <style> #div1{width:200px;height:200px; background:red;} < ...

  10. lucene-SpanNotQuery和SpanOrQuery交迭与全局跨度

    1.在匹配结果中排除相互交迭的跨度 SpanNotQuery构造函数的第一个参数表示要包含的跨度对象,第二个参数表示要排除的跨度对象. 1) SpanNearQuery quick_fox=new S ...