浅复制copy,深复制NSCopy

深浅复制的使用场景:
在@property里面作为关键字使用,在set方法里面调用 【 obj copy】生成对象并返回
 
正常情况:使用retain strong的时候是这样
-(void)set:(nssing*)str
{ //经典设置器
if (_string != str)
_string release;
_string= str retain;
}
 
如果关键字使用copy,在set方法里面是这样的
-(void)set:(nssing*)str
{ //经典设置器
if (_string != str)
_string release;
_string= str copy
}
至于这个时候是创建了新对象,新内存还是同一块内存,取决于copy 前面的对象是ns 还是nsmutab
如果是不变的,就是同一块内存,是复制了一个指向同一块内存的指针,称浅拷贝(指针拷贝)
 
如果是可变的,生成新内存,新内存里面内容跟上面那个一样,新内存计数是1,原内存计数不变(内容拷贝,深拷贝)
 
 
一般情况下,自定义的对象不要使用copy 和nscopy
目前,继承自nsobject的类,基本都实现了nscopying,nsmutabcopying协议 。 来自于foundtion的
比如说:NSString NSArray NSDictionary . NSData .
 
实现协议之后还要重载copyWithZone方法
 
 
 
 
二:
COPY的使用场景:
二.@property中的copy参数
copy参数的作用:
在属性的 setter 实现中对赋值对象做一次copy操作,将copy操作的结果赋值给属性.
 
具体情况如下:
 
1.情况一: 属性是不可变类型的. 如 NSString
如果赋值对象是可变的,那么会将一个不可变副本赋值给属性.
如果赋值对象是不可变的,那么不会产生新的副本,只是对复制对象引用计数加1.
 
2.情况二. 属性是可变类型的, 建议不要是用 copy 参数
因为可变类型的属性,我们是会根据需求对其内容进行修改的,如果用copy那么,该属性保存的真是对象类型就是不可变的,这样如果去修改这个属性,编译时不会报错,但是运行会奔溃,因为尝试去修改一个不可变类型的对象.
 
3.情况三. 自定义对象类型, 一般情况下我们不会对自定义的对象使用 copy 参数.
必须遵守<NSCopying>协议 ,实现 copyWithZone: 方法. 才能够调用 copy 方法.建立副本
 
posted @ 2018-01-25 23:54  gaogaihui  阅读(197)  评论(0编辑  收藏  举报