基于runtime 的iOS反射

主要通过runtime 获取类的属性,并通过jeson对对应的类进行赋值。

#import <Foundation/Foundation.h>

 

 

 

@interface BaseModel : NSObject

@property (nonatomic, strong) NSMutableArray *undefineValueArray;

/**

 *  给类中的属性一一赋字典的值

 *

 *  @param dataSource <#dataSource description#>

 *

 *  @return <#return value description#>

 */

-(BOOL)CreatClasswithNSObject:(NSObject*)dataSource;

/**

 *  设置 属性中有但是字典中没有的字段名字

 *

 *  @param key <#key description#>

 *

 *  @return <#return value description#>

 */

-(NSString*)changgeWith:(NSString*)key;

/**

 *  通过jeseon字符串将字典转换为数组

 *

 *  @param jseonData <#jseonData description#>

 *

 *  @return <#return value description#>

 */

+(NSMutableArray*)ArrayWithJesonData:(id)jseonData;

/**

 *  <#Description#>

 *

 *  @return <#return value description#>

 */

-(NSDictionary*)valueForUnDefine;

/**

 *

 *

 *  @return <#return value description#>

 */

-(NSMutableArray*)getUnDefineKey;

 

@end

 

 

#import <objc/runtime.h>

#import "BaseModel.h"

 

@implementation BaseModel

-(NSMutableArray*)getUnDefineKey{

  return   self.undefineValueArray;

}

/**

 *  获取所有的类名放到数组当中

 *

 *  @return

 */

- (NSArray*)propertyKeys

{    ///存储属性的个数

    unsigned int outCount, i;

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

    objc_property_t *properties = class_copyPropertyList([self class], &outCount);

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

    NSMutableArray *keys = [[NSMutableArray alloc] initWithCapacity:outCount];

    for (i = 0; i < outCount; i++) {

        ///取出第一个属性

        objc_property_t property = properties[i];

        NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];

        [keys addObject:propertyName];

    }

    free(properties);

    return keys;

}

/**

 *  通过iOS反射 将字典中的Key Value 存放到类中返回

 *

 *  @param dataSource <#dataSource description#>

 *

 *  @return <#return value description#>

 */

-(BOOL)CreatClasswithNSObject:(NSObject*)dataSource

{

    

    BOOL ret = NO;

    for (NSString *key in [self propertyKeys]) {

        if ([dataSource isKindOfClass:[NSDictionary class]])

        {

            ret = ([dataSource valueForKey:key]==nil)?NO:YES;

        }

        else

        {

            ret = [dataSource respondsToSelector:NSSelectorFromString(key)];

        }

        if (ret)

        {

            id propertyValue = [dataSource valueForKey:key];

            //该值不为NSNULL,并且也不为nil

            if (![propertyValue isKindOfClass:[NSNull class]] && propertyValue!=nil) {

                [self setValue:propertyValue forKey:key];

            }

        }

        else

        {

            if ([self valueForUnDefine]&&[self valueForUnDefine][key])

            {

                    [self setValue:[dataSource valueForKey:[self valueForUnDefine][key]] forKey:key];

            }

            else{

                if (self.undefineValueArray.count ) {

                    [self.undefineValueArray addObject:key];

                }

                else{

                    self.undefineValueArray = [NSMutableArray array];

                    [self.undefineValueArray addObject:key];

                }

 

            }

            

//            if ([self changgeWith:key]) {

//                [self setValue:[dataSource valueForKey:[self changgeWith:key]] forKey:key];

//            }

//            else{

//                NSLog(@"-------%@没有找到的属性",key);

//            }

        }

    }

    return ret;

    

    

}

 

/**

 *  jeson 存放到可变数组中

 *

 *  @param jseonData 网络请求下来的

 *

 *  @return

 */

+(NSMutableArray*)ArrayWithJesonData:(id)jseonData

{

    if ([jseonData isKindOfClass:[NSArray class]]) {

        NSMutableArray * array = [NSMutableArray array];

        for (NSDictionary * dic in jseonData) {

            id  test = [[[self class] alloc] init];

            [test CreatClasswithNSObject:dic];

            [array addObject:test];

        }

        return array;

    }

    else if ([jseonData isKindOfClass:[NSDictionary class]])

    {

        NSMutableArray * array = [NSMutableArray array];

        id  test = [[[self class] alloc] init];

        [test CreatClasswithNSObject:jseonData];

        [array addObject:test];

        return array;

    }

    else{

        return nil;

    }

    

}

 

/**

 *  设置字典的返回参数

 *

 *  @param key 是类本身属性 Value是字典中model

 *

 *  @return

 */

-(NSString*)changgeWith:(NSString*)key{

    NSDictionary * dic =@{@"类本身属性名称":@"jeson字典中名称"};

    return([dic valueForKey:key]==nil)?nil:dic[key];

}

 

-(NSDictionary*)valueForUnDefine{

    NSDictionary * dic =@{@"类本身属性名称":@"jeson字典中名称"};

    return dic;

}

 

- (void)runTests

{

    unsigned int count;

    Method *methods = class_copyMethodList([self class], &count);

    

    for (int i = 0; i < count; i++)

    {

        Method method = methods[i];

        SEL selector = method_getName(method);

        NSString *name = NSStringFromSelector(selector);

        //        if ([name hasPrefix:@"test"])

        NSLog(@"方法 名字 ==== %@",name);

        if (name)

        {

            //avoid arc warning by using c runtime

            //            objc_msgSend(self, selector);

        }

        

        NSLog(@"Test '%@' completed successfuly", [name substringFromIndex:4]);

    }

}

 

@end

posted on 2016-05-31 10:58  D_ye了淡淡  阅读(285)  评论(0编辑  收藏  举报