iOS关于copy,mutablecopy;深拷贝,浅拷贝的浅见

首先我们先搞清楚深拷贝和浅拷贝的概念吧:

深拷贝:内存地址的拷贝,重新开辟一块内存区域,和原来的内存区域不相关。

浅拷贝:仅仅只是指针的拷贝,指向同一块内存空间。

注意: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协议。

你可能感兴趣的:(iOS关于copy,mutablecopy;深拷贝,浅拷贝的浅见)