若想令自己的类具有拷贝功能,则需实现 NSCopying 协议,如果自定义的对象分为可变版本与不可变版本的话,那就要同时实现 NSCopying 与 NSMutableCopying 协议
1)、让自己的类可以使用copy修饰符的步骤:
a)、让自己的类遵循NSCopying协议
b)、实现NSCopying协议中必须实现的代理方法:
-(id)copyWithZone:(NSZone*)zone;
- (instancetype)initWithName:(NSString *)name age:(NSUInteger)age sex:(Sex)sex;
示例代码:
- (id)copyWithZone:(NSZone *)zone {
User *copy = [[[self class] allocWithZone:zone]
initWithName:_name
age:_age
sex:_sex];
return copy;
}
- (void)setName:(NSString *)name {
if (_name != name) {
//[_name release];//MRC
_name = [name copy];
}
}
- 如何重写带copy关键字的setter:
- (void)setName:(NSString *)name {
//[_name release];
_name = [name copy];
}
- 如何确保 name 被 copy?在初始化方法(initializer)中做:
- (instancetype)initWithName:(NSString *)name
age:(NSUInteger)age
sex:(Sex)sex {
if(self = [super init]) {
_name = [name copy];
_age = age;
_sex = sex;
_friends = [[NSMutableSet alloc] init];
}
return self;
}
Copy & MutableCopy
使用copy或mutableCopy方法可以创建一个对象的副本
copy
需要实现NSCoppying协议
这些创建的是不可变副本(如NSString、NSArray、NSDictionary)
mutableCopy
需要先实现NSMutableCopying协议
创建的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
copy的目的是建立副本,同时修改原始对象和复本不会互相干扰
深复制:
内容拷贝,源对象和副本指向的是不同的两个对象
源对象引用计数器不变,副本计数器设置为1
浅复制:
指针拷贝,源对象和副本指向的是同一个对象
对象的引用计数器+1,其实相当于做了一次retain操作