iOS反向编译出model类所有属性并赋值

目前开发中,面对大量的返回参数,几乎都是用YYModel来处理model类,但是有时难免要对model类的属性进行特殊处理,这里提供了一种通过运行时来处理model属性的方法:

#import "TR_Model.h"

#import

@interfaceTR_Model (Extension)

-(void)displayCurrentModleProperty;

@end

具体逻辑处理如下所示:

#import "TR_Model+Extension.h"

constNSString *propertiesKey =@"propertiesKey";

@implementationTR_Model (Extension)

///通过运行时获取当前对象的所有属性的名称,以数组的形式返回

- (NSArray *) allPropertyNames{

    ///存储所有的属性名称

    NSMutableArray *allNames = [[NSMutableArray alloc] init];

    ///存储属性的个数

    unsignedintpropertyCount =0;

    ///通过运行时获取当前类的属性

    objc_property_t *propertys = class_copyPropertyList([selfclass], &propertyCount);


    //把属性放到数组中

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

        ///取出第一个属性

        objc_property_t property = propertys[i];

  constchar* propertyName = property_getName(property);

    [allNames addObject:[NSString stringWithUTF8String:propertyName]];

    }

    ///释放

    free(propertys);

    returnallNames;

}

#pragma mark -- 通过字符串来创建该字符串的Setter方法,并返回

- (SEL) creatGetterWithPropertyName: (NSString *) propertyName{

    //1.返回get方法: oc中的get方法就是属性的本身

    returnNSSelectorFromString(propertyName);

}

- (void) displayCurrentModleProperty{


    //获取实体类的属性名

    NSArray *array = [selfallPropertyNames];

    //拼接参数

    NSMutableString *resultString = [[NSMutableString alloc] init];

    for(inti =0; i < array.count; i ++) {

        //获取get方法

        SELgetSel = [selfcreatGetterWithPropertyName:array[i]];

        if([selfrespondsToSelector:getSel]) {

            //获得类和方法的签名

            NSMethodSignature *signature = [selfmethodSignatureForSelector:getSel];

            //从签名获得调用对象

            NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

            //设置target

            [invocation setTarget:self];

            //设置selector

            [invocation setSelector:getSel];

            //接收返回的值

            NSObject *__unsafe_unretainedreturnValue =nil;

            //调用

            [invocation invoke];

            //接收返回值

            [invocation getReturnValue:&returnValue];

            if([returnValue isKindOfClass:[NSNull class]] || returnValue ==nil|| [returnValue isEqual:@""]) {

                returnValue =@"--";

            }

            [selfsetValue:returnValue forKey:array[i]];

            [resultString appendFormat:@"%@\n", returnValue];

            NSLog(@"%@--%@",array[i],returnValue);

        }

    }

}

@end

链接: 百度网盘 请输入提取码 提取码: iikg 

你可能感兴趣的:(iOS反向编译出model类所有属性并赋值)