iOS自定义对象的拷贝

自定义对象的拷贝

//分析: NSString可直接进行拷贝 [str copy];

    NSString *str = @"hello";
    NSString *str1 = [str copy];
    NSString *str2 = [str mutableCopy];
    NSLog(@"str1 = %@,str2 = %@",str1,str2);

//自定义拷贝的执行顺序:

    //调用copy-> copyWithZone
    Person *xiaoQ = [[Person alloc] init];
    xiaoQ.name = @"xiaoQiang";
    xiaoQ.age = 18;
    Person *xiaoM = [xiaoQ copy];  //自定义对象的拷贝
    NSLog(@"xiaoQ = %@",xiaoQ);
    NSLog(@"xiaoM = %@",xiaoM);
    Person *xiaoB = [xiaoQ mutableCopy];
    NSLog(@"xiaoB = %@",xiaoB);

//自定义对象拷贝崩溃:

    //疑问:NSString与自定义对象都是调NSObject的方法,要报错的话NSString也要报错
    //通过分析1:NSString遵守了NSCopying协议:从而可知,NSString中一定实现了协议中必须的方法:copyWithZone
    //通过分析2:字符串调用copy方法,必定内部调用了copyWithZone,字符串中有这个copyWithZone的实现方法所以不会奔溃;
    //通过分析3: 自定义对象调用copy方法,内部也调用了copyWithZone

    //最后,自定义对象遵守NSCopying,实现copyWithZone,崩溃就解决了
    //结论:以后系统会提供很多类似的协议接口:
    //不用我们生成的部分:
    //1. 系统定制协议: NSCopying
    //2. 被代理者:     NSObject

//需要我们做的事情:

    //3: 代理者: 遵守协议,实现协议方法,(隐含设置代理)

// 遵守协议

@interface Person : NSObject<NSCopying,NSMutableCopying>

//实现协议方法

-(id)copyWithZone:(NSZone *)zone
{
    NSLog(@"自定义对象拷贝");

    //allocWithZone: 开辟zone大小的空间
    Person *xiaoM = [Person allocWithZone:zone];
    xiaoM.name = self.name;
    xiaoM.age  =self.age;

return xiaoM;
}

-(id)mutableCopyWithZone:(NSZone *)zone
{
    NSLog(@"自定义对象的mutable拷贝");

    Person *xiaoM = [Person allocWithZone:zone];
    xiaoM.name = _name;
    xiaoM.age = _age;
    return xiaoM;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值