之前有很多初学者, 问我Copy到底什么时候用?
A:
在OC
里面有个值对象的概念,当你新定义一个属性是值对象时就应该用copy来修饰。那么都什么对象是值对象呢?
值对象: 指封装了基本值(属于 C 数据类型)且提供与该值相关的服务的对象。值对象以对象形式表示标量类型。Foundation 框架向您提供了以下类(这些类产生对象,用于字符串、二进制数据、日期与时间、数字以及其他值):
NSString
和
NSMutableString
,
NSData
和
NSMutableData
,
NSDate
,
NSNumber
,
NSValue
B:
当一个指针执行的对象属性值发生改变时,不影响另一个对象,那么需要分配两个不同的内存地址,也就是说,我们就不可以采用retain关键字了,而是要采用copy 关键字,因为copy关键字会在复制时重新创建一个新的对象。
这里再提一下 :
Copy:
建立一个索引计数为
1
的对象,在赋值时使用传入值的一份拷贝。
(扩展:深拷贝[内存]和浅拷贝[指针]最大区别是什么?:“主要看子类对象的地址是否一致”)
深拷贝和浅拷贝的理解?
总结:深拷贝拷贝的是内容,浅拷贝拷贝的是指针。深拷贝和浅拷贝最大的区别就是子类对象的地址是否改变,如果子类对象的地址改变那么就是深拷贝。
详细解释:
浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身。通过对象的指针来访问这个对象----只赋值地址
深层复制(mutableCopy):复制引用对象本身---再创建一个对象
意思就是有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。//当修改A时,A copy不变。