copy关键字

240 阅读1分钟

之前对copy感觉很模糊,牵扯到copy、mutableCopy、@property关键字copy,就感觉互相混杂,现在来总结一下自己的观点。

1. copy复制

1)copy是一个方法,定义在NSObject中,作用:拷贝对象

NSString----->copy----->生成不可变字符串,没有产生新对象

NSMutableString----->copy----->生成不可变字符串,产生了新对象

2)mutableCopy是一个方法,定义在NSObject中,作用:拷贝对象

NSString----->copy----->生成可变字符串,深拷贝

NSMutableString----->mutableCopy----->生成可变字符串对象,深拷贝

2. 字符串对象拷贝的引用计数器问题

1)若字符串对象存储在常量区中,存储在常量区的数据是不允许回收的。所以存储在常量区的字符串对象的引用计数器是一个超大的数,并且retain和release是无效的 image.gif

2)若字符串存储在堆区,这个字符串和普通的字符串对象是一样的。引用计数器默认是1.

image.gif

3. @property参数copy

image.gif 有2种方法达到要求:第一种,重写setter

image.gif 第二种方法:@property(nonatomic, copy)NSString *name;

4.自定义类实现copy

条件1)类遵守NSCopying协议
2)实现 -(instancetype)copyWithZone:(NSZone *)zone方法。
如果先要实现浅拷贝,直接返回self,如果实现深拷贝,使用init创建一个新的类。
具体实现如下,这是一个深拷贝

image.gif