美文网首页
NSCopying协议

NSCopying协议

作者: 阳明AI | 来源:发表于2018-05-29 10:05 被阅读42次

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

- (id)copyWithZone:(NSZone *)zone{    
     PersonModel *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:方法。因为指针可能实际指向的是PersonModel的子类。这种情况下,通过调用[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,得到可变的对象。

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

在拷贝对象时,需要注意拷贝执行的是浅拷贝还是深拷贝。深拷贝在拷贝对象时,会将对象的底层数据也进行了拷贝。Foundation框架中提供的所有集合,默认提供的都是浅拷贝。以上面的代码为例,对nameArray执行copy时,得到一个新的数组对象。但是新对象中存放的字符串和nameArray中存放的都是同一个字符串;若执行的是深拷贝,就会对nameArray中的所有字符串执行copy操作,然后再加入到新的对象中。

相关文章

  • 让自己创建的类具备Copy功能

    对于对象具有拷贝功能,则需实现 NSCopying 协议。 声明该类遵从 NSCopying 协议 实现 NSCo...

  • NSCopying协议

    NSCopyingNSCopying是一个与对象拷贝有关的协议。如果想让一个类的对象支持拷贝,就需要让该类实现NS...

  • NSCopying协议

    先来看一段代码 在删除arr1第一个元素的同时,arr2的第一个元素也被删除了,这很好理解,因为两个对象都指向同一...

  • NSCopying协议

    NSCopying协议 如果想令自己的类支持拷贝操作,那就要实现NSCopying协议。 现有自定义类PassMo...

  • NSCopying协议

    如何让自定义对象支持 copy 操作?是重写 copy 方法么?当然不是,而是需要让自定义类实现 NSCopyin...

  • 22: 理解NSCopying协议

    1.NSCopying协议 若想令自定义对象具有拷贝功能,则需要实现NSCopying协议 实现copyWithZ...

  • (二十一)[OC高效系列]理解NSCopying协议

    1.NSCopying协议 若想令自己所写的对象具有拷贝功能,则需要实现NSCopying协议 实现copyWit...

  • 52个有效方法(22) - 理解NSCopying协议

    NSCopying协议 若想令自己所写的对象具有拷贝功能,则需要实现NSCopying协议。 方法中应该用全能初始...

  • 《Effective Objective-C 2.0 》 阅读笔

    第22条:理解NSCopying协议 1. NSCopying协议 如果想令自己的类支持拷贝操作,必须实现NSCo...

  • iOS NSCopying 与 NSMutableCopying

    NSCopying: 如果要调用一个对象的copy方法,这个对象必须遵循NSCopying的协议。这个协议中规定了...

网友评论

      本文标题:NSCopying协议

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