iOS-NSCopying 和 NSMutableCopying协议
Posted MinggeQingchun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS-NSCopying 和 NSMutableCopying协议相关的知识,希望对你有一定的参考价值。
一、NSCopying协议
如果要调用一个对象的copy方法,这个对象必须遵循NSCopying的协议。这个协议中规定了一个方法:
- (id)copyWithZone:(nullable NSZone *)zone;
我们就是通过实现这个方法给对象提供拷贝的功能。对于很多现有类,如NSString,NSDictionary,这个方法系统已经实现,不需要手动调用。但是如果我们自定义了一个类,需要为这个类提供拷贝的功能,就需要自己来动手实现这个方法。
//People.h文件
@interface People : NSObject<NSCopying>
@property (nonatomic, copy)NSString *name;
@end
//People.m文件
@implementation People
- (id)copyWithZone:(nullable NSZone *)zone {
People *people = [[[self class] allocWithZone:zone] init];
people.name = self.name;
return self;
}
@end
如果在NSObject或者直接继承NSObject的子类实现了NSCopying协议,且实现了- (id)copyWithZone:(nullable NSZone *)zone方法,调用[super copyWithZone:zone],这时就会报错:
No visible @interface for 'NSObject' declares the selector 'copyWithZone:'
需要调用[[[self class] allocWithZone:zone] init]
二、NSMutableCopying协议
如果要调用一个对象的mutableCopying方法,这个对象必须遵循NSMutableCopying的协议。这个协议中规定了一个方法:
- (id)mutableCopyWithZone:(nullable NSZone *)zone;
类似NSCopying,如果想要实现对象的mutableCopying,我们就需要实现这个方法。
//People.h文件
@interface People : NSObject<NSMutableCopying>
@property (nonatomic, copy)NSString *name;
@end
//People.m文件
@implementation People
- (id)mutableCopyWithZone:(nullable NSZone *)zone {
People *people = [[[self class] allocWithZone:zone] init];
people.name = self.name;
return self;
}
@end
NSObject实现NSMutableCopying协议同理,在- (id)mutableCopyWithZone:(nullable NSZone *)zone中
不能调用[super mutableCopyWithZone:zone],需要调用[[[self class] allocWithZone:zone] init]
不然会报错:
No visible @interface for 'NSObject' declares the selector 'mutableCopyWithZone:'
注:
1、类直接继承自NSObject,无需调用[super copyWithZone:zone],[super mutableCopyWithZone:zone]
2、父类没有实现NSCopying 和 NSMutableCopying协议,子类实现了NSCopying 和 NSMutableCopying协议,子类无需调用[super copyWithZone:zone],[super mutableCopyWithZone:zone]
3、父类实现了NSCopying 和 NSMutableCopying协议,子类需要调用[super copyWithZone:zone],[super mutableCopyWithZone:zone]
4、copyWithZone:,mutableCopyWithZone:方法中要调用[[[self class] allocWithZone:zone] init]来分配内存
NSCopying 和 NSMutableCopying同理。
以上是关于iOS-NSCopying 和 NSMutableCopying协议的主要内容,如果未能解决你的问题,请参考以下文章
NsMutable 不是 swift 中 [anyobject] 的子类型
如何将 NSString 值设置为 NSMutable 字典?