NSCopying协议
大家在使用可变字典的时候可能已经注意到
- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
后面的key要求是遵守NSCopying协议的一个对象
接下来我们来查看协议中所包含的方法
- copyWithZone:
要求返回一个接受者的复制的新的实例
示例
接下来我们创建一个Person类,提供两个属性
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *code;
@end
然后我们在main函数中调用如下代码
Person *person = [[Person alloc] init];
person.name = @"zhangsan";
person.code = @"123141234";
Person *newPerson = [person copy];
NSLog(@"%@", newPerson);
你会看到这样的崩溃信息
'-[Person copyWithZone:]: unrecognized selector sent to instance 0x100206af0'
说明当前这个方法没有在Person类中找到,接下来我们让Person遵守这个协议
// 多个协议就以逗号分隔
@interface Person : NSObject <NSCopying>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *code;
@end
然后进入.m文件使用相应的协议方法
- (id)copyWithZone:(NSZone *)zone
{
Person *person = [[[self class] allocWithZone:zone] init];
person.name = _name;
person.code = _code;
return person;
}
接下来再次运行程序就没有问题了,当前我们复制了一个person对象,注意他们的空间不一样,但是里面的内容一样.
转载:http://archerzz.ninja/ios/nscopying.html