首先我们先搞清楚深拷贝和浅拷贝的概念吧:
深拷贝:内存地址的拷贝,重新开辟一块内存区域,和原来的内存区域不相关。
浅拷贝:仅仅只是指针的拷贝,指向同一块内存空间。
注意:copy出来的对象都是不可变对象。
下面我们具体分析一下:
1.copy的使用和理解
首先我们要了解copy的意义是什么,其实copy方法的存在就是复制一份和原来互不影响的数据。了解到这个就是我们使用的前提。
(1).对于不可变对象的copy是浅拷贝.
从简单的开始:
NSLog(@"%p",@"1");
NSLog(@"%p",[@"1"copy]);
打印输出的结果:
2019-12-16 21:54:16.647 Delegate[89515:460912] 0x10c6851a0
2019-12-16 21:54:16.647 Delegate[89515:460912] 0x10c6851a0
指针地址完全一样,由此我们可以知道,对于不可变对象的copy只是指针的copy,也就是我们所说的浅拷贝,只是指针的拷贝。但是这个和我们所说的“和原来互不影响的数据”相违背了,为什么呢,其实苹果早就帮我们考虑到了这一点的,我们完全不需要担心这点的。
copy方法拷贝的对象都是不可变的对象,原来的字符串也是不可变的字符串,既然都是不可变的字符串,他们其实没有必要生成2块内存的,可以共享内存空间的,所以同一个指针就够用了,能节省一点内存是一点嘛(对于targetpoint同样适用)。
有同学可能要问了,既然指向同一个内存区域,那么我改变其中一个的值,另一个这不是也得改变嘛,我们来试一试
```
NSString*str1=@"str1";NSString*str2=[str1 copy];
```
我们改变str1的值,str2是不会改变的,这个时候他们会生成不同的内存地址,也就是说新开辟了内存空间。
(2)对于可变对象的copy,生成的是不可变对象。
2.mutablecopy的理解
(1)mutablecopy进行的拷贝都是深拷贝,重新开辟了内存空间。
(2)mutablecopy对可变对象的mutablecopy是可变的,对于不可变对象的mutablecopy是不可变的。
3.对于数组中的copy其实对于数组里面的元素全都是指针copy,如果想要进行内存copy需要重新操作数组;
4.对于自定义的对象,想要进行copy操作,需要实现nscopying或nsmutablecopying协议。同理,如果对一个数组进行copy,数组里面全都是自定义对象,那么这些对象全都要实现nscopying协议。
网友评论