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 数组存储到 sqlite 数据库中

NsMutable 不是 swift 中 [anyobject] 的子类型

过滤自定义对象的 NSMutable 数组

如何将 NSString 值设置为 NSMutable 字典?

NSUserDefaults NSMutable 数组未在会话之间保存

将对象添加到排序的 NSMutable 数组并回答索引路径