1).希望类能被复制,需要遵守NSCopying或NSMutableCopying协议
2).复制对象得时候需决定采用浅拷贝还是深拷贝,但尽量使用浅拷贝
#import <Foundation/Foundation.h>
@interface ECOPerson : NSObject<NSCopying,NSMutableCopying>
@property (nonatomic, copy, readonly) NSString *firstName;
@property (nonatomic, copy, readonly) NSString *lastName;
-(id)initWithFirstName:(NSString *)firstName
andLastName:(NSString *)lastName;
-(void)addFriend:(ECOPerson *)person;
-(void)removeFriend:(ECOPerson *)person;
@end
#import "ECOPerson.h"
@implementation ECOPerson
{
NSMutableSet *_friends;
}
-(id)copyWithZone:(NSZone *)zone
{
//分配一块内存
//浅复制
ECOPerson *copy = [[[self class] allocWithZone:zone]
initWithFirstName:_firstName andLastName:_lastName];
return copy;
}
-(id)initWithFirstName:(NSString *)firstName
andLastName:(NSString *)lastName
{
if (!self) {
self = [super init];
//深复制
_firstName = [firstName copy];
_lastName = [lastName copy];
_friends = [NSMutableSet new];
}
return self;
}
-(void)addFriend:(ECOPerson *)person
{
[_friends addObject:person];
}
-(void)removeFriend:(ECOPerson *)person
{
[_friends removeObject:person];
}
-(id)mutableCopyWithZone:(NSZone *)zone
{
ECOPerson *copy = [[[self class] allocWithZone:zone]
initWithFirstName:_firstName andLastName:_lastName];
//访问内部变量 ->
copy->_friends = [_friends mutableCopy];
return copy;
}
@end