美文网首页
NSCopying与NSMutableCopying协议

NSCopying与NSMutableCopying协议

作者: memelook | 来源:发表于2018-01-05 17:57 被阅读6次

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

相关文章

网友评论

      本文标题:NSCopying与NSMutableCopying协议

      本文链接:https://www.haomeiwen.com/subject/dqvsnxtx.html