[iOS]深拷贝/浅拷贝区别
2016-07-05 00:23
447 查看
来点鸡汤:
// 所谓拷贝 就是在原有的对象的基础上产生一个新的副本对象.有两点原则:
// 1. 改变原对象的属性和行为不会影响副本对象
// 2. 改变副本对象的属性和行为不会影响原对象
来段示例代码
// 所谓拷贝 就是在原有的对象的基础上产生一个新的副本对象.有两点原则:
// 1. 改变原对象的属性和行为不会影响副本对象
// 2. 改变副本对象的属性和行为不会影响原对象
来段示例代码
- (void)viewDidLoad { [super viewDidLoad]; /##########################################/ // 以NSArray 为例 /##########################################/ // 1. 不可变对象调用copy方法 NSArray *arr1 = [NSArray arrayWithObjects:@"1", nil]; // 不会产生新对象 NSArray *copyArr1 = [arr1 copy]; NSLog(@"%p, %p\n", arr1, copyArr1); NSLog(@"%ld, %ld\n", [arr1 retainCount], [copyArr1 retainCount]); // 字符串引用计数-1 /##########################################/ // 打印结果 **0x7fbdd340dbf0, 0x7fbdd340dbf0** 2, 2 // 这个为浅拷贝, 没有产生新对象, copyArr1还是指向arr1的地址![1.不可变对象调用copy方法.png](//upload-images.jianshu.io/upload_images/1400788-107ba7070e903e47.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) /##########################################/ // 2. 不可变对象调用mutableCopy方法 NSArray *arr2 = [NSArray arrayWithObjects:@"2", nil]; // 会产生新的可变对象 NSArray *mutableCopyArr2 = [arr2 mutableCopy]; NSLog(@"%p, %p\n", arr2, mutableCopyArr2); NSLog(@"%ld, %ld", [arr2 retainCount], [mutableCopyArr2 retainCount]); /##########################################/ // 打印结果 **0x7fbdd3600250, 0x7fbdd36445ba** 1, 1 // 这个为深拷贝, 产生新的对象, 引用计数分别为1![2.不可变对象调用mutableCopy方法.png](//upload-images.jianshu.io/upload_images/1400788-e0b7176e1cbca7c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) /##########################################/ // 3. 可变对象调用copy方法 NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@"3", nil]; // 会产生不可变对象 id copyArr3 = [arr3 copy]; NSLog(@"%@, %p, %p\n", [copyArr3 class], arr3, copyArr3); NSLog(@"%ld, %ld", [arr3 retainCount], [copyArr3 retainCount]); /##########################################/ // 打印结果 **__NSArrayI, 0x7fb120f12a40, 0x7fb120f10c70** 1, 1 // NSArrayI代表不可变数组, 这个为深拷贝, 产生新对象(由可变对象变成不可变对象), 引用计数分别为1![3.可变对象调用copy方法.png](//upload-images.jianshu.io/upload_images/1400788-ba00f376633b7f8c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) /##########################################/ // 4. 可变对象调用mutableCopy方法 NSMutableArray *arr4 = [NSMutableArray arrayWithObjects:@"4", nil]; // 会产生可变对象 id mutableCopyArr4 = [arr4 mutableCopy]; NSLog(@"%@, %p, %p", [arr4 class], arr4, mutableCopyArr4); NSLog(@"%ld, %ld", [arr4 retainCount], [mutableCopyArr4 retainCount]);/##################################################/ // 打印结果 **__NSArrayM, 0x7fc06062f930, 0x7fc06052f960** 1, 1 // NSArrayM代表可变数组, 这个为深拷贝, 地址不同, 引用计数分别为1![4.可变对象调用mutableCopy方法.png](//upload-images.jianshu.io/upload_images/1400788-16bd08da342a095c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) /##################################################/ // 总结: /* 只有在第一种情况才是浅复制 运用copy的终极目的是: 当我赋值后,改变旧值不会影响新值. 如果要改变,就用retain 浅拷贝: 好比是你的影子, 你完了, 影子也完了. 深拷贝: 好比是你的克隆人, 你完了, 克隆人还在. */ }
相关文章推荐
- iOS RunLoop简介
- iOS判断是否有权限访问相机,相册,定位
- iOS横屏应用的设置
- iOS中的runtime应用
- ios开发 强制横屏的实现
- 李洪强iOS开发之OC[009] -OC无参方法的声明实现和调用
- CCNA:路由器交换机IOS密码配置和4种模式简介
- iOS开发-二维码扫描和应用跳转
- 第三方支付
- iOS 缓存处理及理解
- ios 对于常用的NSUserDefults的封装
- iOS使用Workspace来管理多项目
- iOS开发:调用指纹传感器
- cocoapods安装第三方框架失败.
- iOS开发:唯一标志符
- iOS--一个简单的提示条代码
- [iOS]Xcode+GitHub远程代码托管(GIT, SVN)
- [iOS]Xcode处理过时方法的警告
- IOS常用宏定义
- iOS开发71-解决调试时Could not find Developer Disk Image问题