NSCopying与NSMutableCopying协议

1).希望类能被复制,需要遵守NSCopying或NSMutableCopying协议
2).复制对象得时候需决定采用浅拷贝还是深拷贝,但尽量使用浅拷贝

#import 

@interface ECOPerson : NSObject
@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

你可能感兴趣的:(NSCopying与NSMutableCopying协议)