运行时 动态获取成员变量

#import <objc/runtime.h>
// 字典转模型.
// 最好是根据自身的属性来赋值就OK了.
// 需要获取模型的属性值.
// OC 中没有提供获取一个类的属性的方法,需要使用运行时语言来获取.
+ (instancetype)modelWithDict:(NSDictionary *)dict
{

    Model *mod = [[Model alloc] init];

    // 获取属性数组
    NSArray *array = [mod getProperties];

    // 遍历属性数组 -> 赋值
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        // 将属性当作 key 值.
        NSString *key = obj;

        if (dict[key]) {

            [mod setValue:dict[key] forKey:key];
        }

    }];

    // 利用上面遍历属性数组,得到的数据可以保证肯定有值,防止 KVC 赋值错误.
   // [mod setValuesForKeysWithDictionary:dict];

    return mod;
}

// 动态的获取类的属性.
- (NSMutableArray *)getProperties
{
    // 参数1: 表明要获取哪一个类的属性
    // 参数2: 需要一块地址来存放属性的数量.

    unsigned int count;
    // 获取属性数组
    objc_property_t *properties = class_copyPropertyList(self.class, &count);

    NSMutableArray *array = [NSMutableArray array];

    // 遍历属性数组,获取其中的值.
    for (int i = 0 ; i < count; i++) {

        // 获取属性数组中的每一个属性
        objc_property_t pro = properties[i];

        // 得到属性名称.
        const char *name = property_getName(pro);

        // 将 C语言的数据类型转换成 OC 的数据类型
        NSString *property = [[NSString alloc] initWithUTF8String:name];

        NSLog(@"%@",property);

        // 将属性放到一个数组中
        [array addObject:property];

    }

    return array;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值