copy和mutableCopy简单说明
copy和mutableCopy
- copy
- 只会产生不可变的副本对象(比如NSString)
- mutableCopy
- 只会产生可变的副本对象(比如NSMutableString)
- copy和mutableCopy来自NSObject,适用于所有的对象
copy和mutableCopy拷贝系统对象
源对象类型 | 拷贝方法 | 副本对象类型 | 是否产生了新对象 | 拷贝类型 |
---|---|---|---|---|
NS* | copy | NS* | 否 | 浅拷贝 |
NS* | mutableCopy | NSMutable* | 是 | 深拷贝 |
NSMutable* | copy | NS* | 是 | 深拷贝 |
NSMutable* | mutableCopy | NSMutable* | 是 | 深拷贝 |
- 注:
*是通配符
,比如NSString,NSMutableString,NSArray,NSMutableArray, NSDictionary,NSMutableDictionary - 注:深拷贝 == 内容拷贝;浅拷贝 == 指针拷贝;
copy拷贝自定义对象
- 首先自定义对象需要遵守协议
<NSCopying>
- 需要重写方法
-(id)copyWithZone:(NSZone *)zone
,返回自定义的对象 [person copy]
;copy方法内部会调用-(id)copyWithZone:(NSZone *)zone
- copy方法拷贝的自定义对象是可变的
-(id)copyWithZone:(NSZone *)zone { // zone是系统已经分配好的内存空间 ZMJPerson *person = [ZMJPerson allocWithZone:zone] init]; person.age = self.age; person.money = self.money; return person; }
mutableCopy拷贝自定义对象
- 首先自定义对象需要遵守协议
<NSMutableCopying>
- 其次需要重写方法
- (id)mutableCopyWithZone:(NSZone *)zone
- 但一般没有必要使用mutableCopy拷贝自定义对象,因为使用copy方法拷贝的自定义对象也是可变的,两个方法的作用一样,一般使用copy拷贝自定义对象
copy和strong在@property参数中使用的比较
@property (nonatomic, strong) NSString *name;
@property (nonatomic, copy) NSString *name;
- 如果使用strong,对应的name属性的setter方法是直接赋值(指针拷贝)
- (void)setName:(NSString *)name { _name = name; }
- 如果使用copy,对应的name属性的setter方法是先将name对象拷贝(有可能指针拷贝,有可能是内容,取决于具体的对象),然后赋值
- (void)setName:(NSString *)name { _name = [name copy]; }
copy在@property参数中使用的注意点
- 以下代码会出现严重的问题
@property (nonatomic, copy) NSMutableString *name;
- 分析
- copy拷贝的对象永远是不可变的,也就是name对象是不可变的,因为它内部赋值方式是
_name = [name copy];
- 使用NSMutableString声明可变的指针指向不可变的name字符串对象,极其不合理,外界以为是NSMutableString类型,一旦调用
appendString:
方法,会直接报错,因为name对象本质是不可变的;
- copy拷贝的对象永远是不可变的,也就是name对象是不可变的,因为它内部赋值方式是