首页 技术 正文
技术 2022年11月15日
0 收藏 573 点赞 4,917 浏览 2660 个字
来点鸡汤:

// 所谓拷贝 就是在原有的对象的基础上产生一个新的副本对象.有两点原则:

//   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
     浅拷贝: 好比是你的影子, 你完了, 影子也完了.
     深拷贝: 好比是你的克隆人, 你完了, 克隆人还在.
     
     */
    
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,955
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,479
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,291
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,108
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,740
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,774