浅入深出的Copy和MutableCopy理解

拷贝的目的

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

举个例子

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

输出结果:ui

abcabcabc,abcabcabc,abcabcabc
0xf9f7789ebc9c00cc,0xf9f7789ebc9c00cc,0x6000011f7090
复制代码

疑问

  • 为何a 和b 地址同样
    • 咱们思考一下,因为a 为不可变字符串,自己就是不能够改变的。因此只须要拷贝一个新的指针去指向a指向的地址就能够了。 而c是a mutableCopy得来的。由于变成NSMutableString 并且不影响以前的对象,因此要拷贝出一个新的内存空间。

因此这里就引出一个概念spa

  • 深拷贝指针

    • 内容拷贝
    • 建立新对象
  • 浅拷贝code

    • 指针拷贝
    • 引用计数+1
  • 为何浅拷贝要引入计数+1 由于a 和 b 指向同一个内存地址。 若是不引用计数+1,会形成[a release]的时候 a对应的空间引用计数为0,形成释放。而此时b 还在引用释放的内存空间,就会产生坏内存访问的崩溃现象orm

其余拷贝对象同理

不可变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 对象 想深刻了解的的能够看一下。get

总结

NSString NSMutableString NSArray NSMutableArray NSDictionary NSMutableDictionary
copy 浅拷贝 深拷贝 浅拷贝 深拷贝 浅拷贝 深拷贝
mutableCopy 深拷贝 深拷贝 深拷贝 深拷贝 深拷贝 深拷贝
相关文章
相关标签/搜索