NSCopying

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值