iOS开发 拷贝之NSCoping与NSMutableCopying协议

NSCopiny

NSCopying是一个与对象拷贝有关的协议。如果想让一个类的对象支持拷贝,就需要让该类遵守并实现NSCopying协议。NSCopying协议中的方法只有一个- (id)copyWithZone:(NSZone *)zone。当我们的类遵守了NSCopying协议,通过类的对象调用copy方法时,copy方法就会去调用我们实现的- (id)copyWithZone:(NSZone *)zone方法,实现拷贝功能。实现代码如下所示:

- (id)copyWithZone:(NSZone *)zone{    
        Person *model = [[[self class] allocWithZone:zone] init];
        model.firstName = self.firstName;
        model.lastName  = self.lastName;
        //未公开的成员
        model->_nickName = _nickName;
        return model;
}

说明:在- (id)copyWithZone:(NSZone *)zone方法中,一定要使用通过[self class]方法返回的对象去调用allocWithZone:方法。因为指针可能实际指向的是Person的子类,例如:StudentTeacher。这种情况下,通过调用[self class],就可以返回正确的类的类型对象。

NSMutableCopying

NSCopying协议与NSMutableCopying的区别主要是在于,返回的对象是否是可变类型的。以Foundation框架的NSArray为例

NSArray *nameArray = @[@"Jim", @"Tom", @"David"];
NSArray *copyArray = [nameArray copy];
NSMutableArray *mutableCopyArray = [nameArray mutableCopy];
[mutableCopyArray addObject:@"Sam"];

``NSArray对象调用copy方法时,copy方法会调用-(id)copyWithZone:(NSZone *)zone,得到对象的一份拷贝,但得到的对象还是不可变的对象。而NSArray对象调用mutableCopy方法时,mutableCopy方法会调用- (id)mutableCopyWithZone:(NSZone *)zone`,得到可变的对象。

因此,如果自定义类具有可变和不可变的区别,想让它支持拷贝时,就需要同时实现NSCopyingNSMutableCopying,在- (id)copyWithZone:(NSZone *)zone返回的是不可变对象,在- (id)mutableCopyWithZone:(NSZone *)zone返回的是可变对象。

欢迎大家踊跃评论,让我们一起探讨技术!!
如果觉得文章不错,请帮忙点击文章下方的喜欢!!
你的支持将是对我最好的鼓励, 谢谢!!!

你可能感兴趣的:(iOS开发 拷贝之NSCoping与NSMutableCopying协议)