专栏首页老沙课堂浅入深出Copy和mutableCopy

浅入深出Copy和mutableCopy

拷贝的目的

拷贝出一个和原对象的相同的副本,互不影响

举个例子

    NSString *a = [NSString stringWithFormat:@"abcabcabc"];
    NSString *b = [a copy];
    NSString *c = [a mutableCopy];
    
    NSLog(@"%@,%@,%@",a,b,c);
    NSLog(@"%p,%p,%p",a,b,c);	

输出结果:

abcabcabc,abcabcabc,abcabcabc
0xf9f7789ebc9c00cc,0xf9f7789ebc9c00cc,0x6000011f7090

疑问

  • 为什么a 和b 地址一样
    • 我们思考一下,由于a 为不可变字符串,本身就是不可以改变的。所以只需要拷贝一个新的指针去指向a指向的地址就可以了。而c是a mutableCopy得来的。因为变成NSMutableString 而且不影响之前的对象,所以要拷贝出一个新的内存空间。

所以这里就引出一个概念

  • 深拷贝
    • 内容拷贝
    • 创建新对象
  • 浅拷贝
    • 指针拷贝
    • 引用计数+1
  • 为什么浅拷贝要引入计数+1 因为a 和 b 指向同一个内存地址。如果不引用计数+1,会造成[a release]的时候 a对应的空间引用计数为0,造成释放。而此时b 还在引用释放的内存空间,就会产生坏内存访问的崩溃现象

其他拷贝对象同理

不可变copy 为浅拷贝

注意

Tagged Pointer对象比较特殊。不用管理引用计数。

  NSString *a = [NSString stringWithFormat:@"abc"];
  NSLog(@"a retainCount = %ld",[a retainCount]);

  NSString *b = [a copy];
  NSLog(@"a retainCount = %ld",[a retainCount]);

  NSString *c = [a mutableCopy];

  NSLog(@"%@,%@,%@",a,b,c);
  NSLog(@"%p,%p,%p",a,b,c);

结果

2019-09-12 13:54:58.109757+0800 Copy MutableCopy[13700:49429440] a retainCount = -1
2019-09-12 13:54:58.109876+0800 Copy MutableCopy[13700:49429440] a retainCount = -1
2019-09-12 13:54:58.109989+0800 Copy MutableCopy[13700:49429440] abc,abc,abc
2019-09-12 13:54:58.110062+0800 Copy MutableCopy[13700:49429440] 0xd5e0520931336344,0xd5e0520931336344,0x6000038d3330

由Tagged Pointed 可以知道a b 为Tagged Pointer 对象 想深入了解的的可以看一下我的上一篇文章

总结

NSString

NSMutableString

NSArray

NSMutablArray

NSDictionary

NSMutableDictionary

copy

浅拷贝

深拷贝

浅拷贝

深拷贝

浅拷贝

深拷贝

mutableCopy

深拷贝

深拷贝

深拷贝

深拷贝

深拷贝

深拷贝

本文分享自微信公众号 - 老沙课堂(gh_f73a6b772d4f),作者:沙睿

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 多线程(一) 有关死锁以及串行并发同步异步概念

    performSelector: withObject: 底层调用[self msgSend];

    老沙
  • RunLoop详解

    线程刚创建的时候没有Ru nLoop对象,RunLoop会在第一次获取它的时候创建

    老沙
  • 据结构与算法(十) AVL树

    因为无法改变添加删除顺序(用户操作决定),所以在每次操作之后,让二叉树达到平衡状态。

    老沙
  • 深拷贝和浅拷贝的区别是什么,如何实现?

    深拷贝是彻底的拷贝,两对象中所有的成员都是独立的一份,而且,成员对象中的成员对象也是独立一份。

    水货程序员
  • 一文搞懂JS中的赋值·浅拷贝·深拷贝

    为什么写拷贝这篇文章?同事有一天提到了拷贝,他说赋值就是一种浅拷贝方式,另一个同事说赋值和浅拷贝并不相同。我也有些疑惑,于是我去MDN搜一下拷贝相关内容,发现并...

    coder_koala
  • JS浅拷贝与深拷贝的学习记录

    大象无痕
  • python深拷贝浅拷贝

    (个人理解)深拷贝就是将原有的数据一模一样的拷贝一份,然后存到另一个地址中,而不是引用地址

    py3study
  • 结构体成员赋值到底是深拷贝还是浅拷贝?

    在《C语言容易忽略的知识点》一文中,有读者说这种结构体复杂成员赋值的的拷贝是浅拷贝(感谢读者提出),那么到底什么是深拷贝,什么是浅拷贝?

    编程珠玑
  • C/C++学习之路(二)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

    大黄大黄大黄
  • 面试 || 12 深拷贝和浅拷贝

    在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其...

    啤酒单恋小龙虾

扫码关注云+社区

领取腾讯云代金券