前几天在做项目的时候遇到了一个比较坑爹的问题,情况可以用下面代码来示意:
1 | - (void)viewDidLoad { |
从cache中取出的数据做了修改后,cache中保存的数据同样被修改了,这不是我们想要的结果。要想知道为什么,就需要了解一下拷贝相关知识。
拷贝分为深拷贝和浅拷贝两种,深拷贝和浅拷贝的区别如下:
类型 | 是否开辟新的内存空间 | 是否影响引用计数 |
---|---|---|
深拷贝 | 是 | 否 |
浅拷贝 | 否 | 是 |
不同拷贝方式产生结果:
源对象类型 | 拷贝方式 | 目标对象 | 拷贝类型(深/浅) |
---|---|---|---|
mutable对象 | copy | 不可变 | 深拷贝 |
mutable对象 | mutableCopy | 可变 | 深拷贝 |
非mutable对象 | copy | 不可变 | 浅拷贝 |
非mutable对象 | mutableCopy | 可变 | 深拷贝 |
可变对象的copy和mutableCopy都是深拷贝
不可变对象的copy是浅拷贝,mutableCopy是深拷贝
copy方法返回的都是不可变对象
对于集合类型的进行copy或mutableCopy都不会影响集合中元素的指针
1 | - (void)test1 |