copy/mutableCopy
因为:
copy执行后得到的结果永远是不可变对象。
mutableCopy执行后得到的结果永远是可变对象。
所以:
不可变对象copy是浅拷贝 只拷贝指针,可变对象copy是深拷贝 拷贝数据
不可变对象或可变对象mutableCopy是深拷贝 拷贝数据
NSString *string = @"11111";
NSString *copyString = [string copy];
NSMutableString *mutableCopyString = [string mutableCopy];
[mutableCopyString appendString:@"aaa"];
NSLog(@"\n%@\n%@",copyString,mutableCopyString);
NSLog(@"\nstring = %p copyString = %p mutableCopyString = %p", string, copyString, mutableCopyString);
-
非系统数据类型对象拷贝需要实现copyWithZone或mutableCopyWithZone方法
否则会崩溃
而且都是深拷贝 重新开辟空间 拷贝数据
XXModel *model = [[XXModel alloc] init];
model.id = 1;
XXModel *copyM = [model copy]; // 崩溃
//崩溃信息: -[XXModel copyWithZone:]: unrecognized selector sent to instance
解决:
#import "XXModel.h"
@interface XXModel() <NSCopying>
@end
@implementation XXModel
- (id)copyWithZone:(NSZone *)zone
{
XXModel *model = [[XXModel allocWithZone:zone] init];
model.id = self.id;
return model;
}
@end
-
@property (nonatomic, copy) NSString *name;
因为
copy执行后得到的结果永远是不可变对象。
mutableCopy执行后得到的结果永远是可变对象。
所以
copy修饰属性后,属性赋值不可变数据则相当于复制指针,属性赋值可变数据相当于复制数据,类似[name copy];
NSMutableString *string = [NSMutableString stringWithFormat:@"222"];
XXModel *model = [[XXModel alloc] init];
model.name = string;
// 不能改变model.name的值,因为其内部copy新的对象
[string appendString:@" 333"];
NSLog(@"name = %@", model.name);
//输出: name = 222