iOS 如何让自己的类具有copy修饰符,如何重写带copy关键字的setter

125 阅读1分钟

若想令自己的类具有拷贝功能,则需实现 NSCopying 协议,如果自定义的对象分为可变版本与不可变版本的话,那就要同时实现 NSCopyingNSMutableCopying 协议

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操作