看了几篇文章,因为文章很新手向,所以内容很繁琐。故整理一下重点,写了测试程序去了解几个知识点,不讨论基本概念。新博客wossoneri.com传送门

非集合类对象的copy与mutableCopy

      //NSString & NSMutableString
NSString *strA = @"origin";
NSLog(@"strA pointer: %p content: %@", strA, strA); NSString *strACopy = [strA copy];
NSLog(@"strCopy pointer: %p content: %@", strACopy, strACopy); NSMutableString *strAMCopy = [strA mutableCopy];
NSLog(@"strMCopy pointer: %p content: %@", strAMCopy, strAMCopy); NSMutableString *strB = [NSMutableString stringWithString:@"mutable string"];
NSLog(@"strB pointer: %p content: %@", strB, strB); NSMutableString *strBCopy = [strB copy];
NSLog(@"strBCopy pointer: %p content: %@", strBCopy, strBCopy); NSMutableString *strBMCopy = [strB mutableCopy];
NSLog(@"strBMCopy pointer: %p content: %@", strBMCopy, strBMCopy); //输出
strA pointer: 0x100003180 content: origin
strCopy pointer: 0x100003180 content: origin
strMCopy pointer: 0x100102e90 content: origin
strB pointer: 0x100700510 content: mutable string
strBCopy pointer: 0x100700570 content: mutable string
strBMCopy pointer: 0x1006002c0 content: mutable string

在非集合类对象中:对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;对mutable对象进行copymutableCopy都是内容复制。

结论

  • [immutableObject copy] // 浅复制
  • [immutableObject mutableCopy] //深复制
  • [mutableObject copy] //深复制
  • [mutableObject mutableCopy] //深复制

集合类对象的copy与mutableCopy

      NSArray *arrayA = @[@[@"A", @"B"], @[@"C", @"D"]];
NSLog(@"arrayA pointer:%p contentA:%p contentB:%p", arrayA, arrayA[0], arrayA[1]); NSArray *arrCopyA = [arrayA copy];
NSLog(@"arrCopyA pointer:%p contentA:%p contentB:%p", arrCopyA, arrCopyA[0], arrCopyA[1]); NSMutableArray *arrMCopyA = [arrayA mutableCopy];
NSLog(@"arrMCopyA pointer:%p contentA:%p contentB:%p", arrMCopyA,arrMCopyA[0], arrMCopyA[1]); NSMutableArray *arrayB = [NSMutableArray arrayWithObjects:@[@"A", @"B"], @[@"C", @"D"], nil];
NSLog(@"arrayB pointer:%p contentA:%p contentB:%p", arrayB, arrayB[0], arrayB[1]); NSArray *arrCopyB = [arrayB copy];
NSLog(@"arrCopyB pointer:%p contentA:%p contentB:%p", arrCopyB, arrCopyB[0], arrCopyB[1]); NSMutableArray *arrMCopyB = [arrayB mutableCopy];
NSLog(@"arrMCopyB pointer:%p contentA:%p contentB:%p", arrMCopyB,arrMCopyB[0], arrMCopyB[1]); //输出
arrayA pointer:0x100700860 contentA:0x100700840 contentB:0x1007007c0
arrCopyA pointer:0x100700860 contentA:0x100700840 contentB:0x1007007c0
arrMCopyA pointer:0x100700990 contentA:0x100700840 contentB:0x1007007c0 arrayB pointer:0x100701970 contentA:0x100700880 contentB:0x100701730
arrCopyB pointer:0x100102080 contentA:0x100700880 contentB:0x100701730
arrMCopyB pointer:0x100701ab0 contentA:0x100700880 contentB:0x100701730

可以看到拷贝过程和非集合类大体相同。注意一点,就是拷贝过程只是针对对象本身,而对象内部的元素还是指针复制,从上面打印的输出就可以看出来。

示例

看如下代码,有一个mutable数组,赋值给immutable数组

@property (nonatomic, strong) NSArray *array;
NSMutableArray *mArray = [NSMutableArray array];
[mArray addObject:@"AA"];
_array = mArray;
NSLog(@"mArray: %p, _array: %p", mArray, _array);
[mArray addObject:@"BB"];
NSLog(@"mArray = %@, _array = %@", mArray, _array);

其中,直接对array属性赋值,这样,_arraymArray便是指向同一对象的指针,因为NSMutableArrayNSArray的子类,故_array能够接受mArray的值。

输出结果:

mArray: 0x126ec3e00, _array: 0x126ec3e00
mArray = (
AA,
BB
), _array = (
AA,
BB
)

下面做个修改,把

_array = mArray;

改为

_array = [mArray copy];

想想结果如何?

mArraymutable对象,拷贝属于(不完全)深拷贝,所以可以想到_array的指针和mArray并不相同,所以后面mArray改变内容也与_array无关。

输出:

mArray: 0x154dc8070, _array: 0x154dcf4e0
mArray = (
AA,
BB
), _array = (
AA
)

小结

Reference

小结 iOS 中的 copy

iOS 集合的深复制与浅复制

最新文章

  1. ubuntu14.04 yuv文件的播放及视频信息的查看
  2. WebView 与PC机Chrome配合调试
  3. AssetBundle loading failed because.....已解决
  4. 【英语魔法俱乐部——读书笔记】 1 初级句型-简单句(Simple Sentences)
  5. [Unity] 2D开发学习教程
  6. Html.RenderPartial、Html.RenderAction联系与区别
  7. python对json的操作总结
  8. C#winform中使用控件的Dock属性进行布局
  9. css+js实现兼容性select的样式
  10. Ubuntu下Code::Blocks无法编译 /bin/sh: 1: g++ not found 解决办法
  11. find_cmd函数分析
  12. C#基础静态类的设计
  13. 浅谈JS中的闭包
  14. CSS实现宽高成比例缩放
  15. Aspose系列实现docx转PDF,PPT转PDF,EXCEL转PDF
  16. Alamofire 框架浅析
  17. Java IO流对象、多线程
  18. Windows kafka_2.11-1.1.0安装
  19. ThreadGroup解读
  20. JavaScriptDom和应用

热门文章

  1. 详解CSS的Flex布局
  2. MySQL+MGR 单主模式和多主模式的集群环境 - 部署手册 (Centos7.5)
  3. Java中char和String 的深入理解 - 字符编码
  4. 基于jQuery消息提示框插件Tipso
  5. python变量和变量赋值的几种形式
  6. 使用Dev C++调试(debug)程序
  7. vmware-vcsa6.5 基本管理
  8. Effective Java——(一)创建和销毁对象
  9. h5py快速入门指南
  10. ife2018 零基础学院 day 3