1).希望類能被復(fù)制奇徒,需要遵守NSCopying或NSMutableCopying協(xié)議
2).復(fù)制對象得時候需決定采用淺拷貝還是深拷貝,但盡量使用淺拷貝
#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
{
//分配一塊內(nèi)存
//淺復(fù)制
ECOPerson *copy = [[[self class] allocWithZone:zone]
initWithFirstName:_firstName andLastName:_lastName];
return copy;
}
-(id)initWithFirstName:(NSString *)firstName
andLastName:(NSString *)lastName
{
if (!self) {
self = [super init];
//深復(fù)制
_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];
//訪問內(nèi)部變量 ->
copy->_friends = [_friends mutableCopy];
return copy;
}
@end