runtime 实现 NSCopying copyWithZong

 

有时候项目中会有些model需要copy, 这个时候就需要实现 NSCopying 协议方法copyWithZone了

但是很多时候都是一个个属性来赋值, 这样做属性少还可以, 但是如果有很多属性呢, 难道也要一个一个去赋值吗? 显然还需要更好的解决办法

以下是用runtime来实现copyWithZong方法的姿势:

 

40c05ec8cec809b104bba1117b210326c9c.jpg

 

// copy代码请下拉:

- (id)copyWithZone:(NSZone *)zone {

    id objCopy = [[[self class] allocWithZone:zone] init];

    // 1.获取属性列表

    unsigned int propertyCount = 0;

    objc_property_t * propertyArray = class_copyPropertyList([self class], &propertyCount);

    for (int i=0; i<propertyCount; i++) {

        objc_property_t  property = propertyArray[i];

        // 2.属性名字

        const char * propertyName = property_getName(property);

        NSString * key = [NSString stringWithUTF8String:propertyName];

        // 3.通过属性名拿到属性值

        id value=[self valueForKey:key];

        NSLog(@"name:%s,value:%@",propertyName,value);

        // 4.判断 值对象是否响应copyWithZone

        if ([value respondsToSelector:@selector(copyWithZone:)]) {

            //5. 设置属性值

            [objCopy setValue:[value copy] forKey:key];

        }else{

            [objCopy setValue:value forKey:key];

        }

    }

    //*****切记需要手动释放

    free(propertyArray);

    return objCopy;

}

转载于:https://my.oschina.net/u/3127531/blog/1831084

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值