如何用runtime对实例对象进行数据化?

实例对像的数据化,刚开始开发iOS的时候,自己曾经用过,可能实际开发都用得不多,因为有KVC,或者三方框架(MJExtension)。要实现需要要运用一点点runtime的方法,但是这样比起来确实麻烦很多。


在.m文件中需要导入runtime

#import <objc/runtime.h>

实现方法:


#pragma mark --把对象转化成字典
+(NSDictionary *)getObjectData:(id)obj{
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    unsigned int propsCount;
    objc_property_t *props = class_copyPropertyList([obj class], &propsCount);
    for(int i = 0;i < propsCount; i++)
    {
        objc_property_t prop = props[i];
        NSString *propName = [NSString stringWithUTF8String:property_getName(prop)];
        id value = [obj valueForKey:propName];
        if(value== nil)
        {
            value = [NSNull null];
        }else{
            value = [self getObjectInternal:value];
        }
        [dic setObject:value forKey:propName];
    }
    return dic;
}

其中需要调用的方法:

#pragma mark --分解对象得到具体的值
+(id)getObjectInternal:(id)obj
{
    if([obj isKindOfClass:[NSString class]]||[obj isKindOfClass:[NSNumber class]]||[obj isKindOfClass:[NSNull class]]){
        return obj;
    }
    if([obj isKindOfClass:[NSArray class]]){
    NSArray *objarr = obj;
    NSMutableArray *arr = [NSMutableArray arrayWithCapacity:objarr.count];
    for(int i = 0;i < objarr.count; i++){
    [arr setObject:[self getObjectInternal:[objarr objectAtIndex:i]]atIndexedSubscript:i];
    }
    return arr;
    }
    if([obj isKindOfClass:[NSDictionary class]])
    {
    NSDictionary *objdic = obj;
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:[objdic count]];
     for(NSString *key in  objdic.allKeys){
    [dic  setObject:[self getObjectInternal:[objdic objectForKey:key]] forKey:key];
        }
    return dic;
    }
 return [self getObjectData:obj];

}

需要调用的方法:

#pragma mark --将对象转化成字典,并把它转化成JSON
+(NSData*)getJSON:(id)obj options:(NSJSONWritingOptions)options error:(NSError*)error{
    return [NSJSONSerialization dataWithJSONObject:[self getObjectData:obj] options:options error:&error];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值