iOS反射机制

来源:互联网 发布:开淘宝店卖虚拟产品 编辑:程序博客网 时间:2024/05/22 06:16

iOS属性反射:说白了,就是将两个对象的所有属性,用动态的方式取出来,并根据属性名,自动绑值。(注意:对象的类,如果是派生类,就得靠其他方式来实现了,因为得到不该基类的属性。

本人常用的反射方式,有如下两种:

  1. 从一个自定义实体类->自定义实体类
  2. 从一个NSDictionary->自定义实体类(此方式最最常用,如网络Json数据会组成NSDictionary。sqlite查询数据,可以用第三方组件组成NSDictionary
直接上码,(这里码在NSObject类别中)
获取对象所有属性:

- (NSArray*)propertyKeys

{

   unsigned int outCount, i;

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

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

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

       objc_property_t property = properties[i];

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

        [keysaddObject:propertyName];

    }

   free(properties);

   return keys;

}



- (BOOL)reflectDataFromOtherObject:(NSObject*)dataSource

{

   BOOL ret = NO;

   for (NSString *keyin [self propertyKeys]) {

       if ([dataSource isKindOfClass:[NSDictionaryclass]]) {

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

        }

       else

        {

            ret = [dataSourcerespondsToSelector:NSSelectorFromString(key)];

        }

       if (ret) {

           id propertyValue = [dataSource valueForKey:key];

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

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

                [selfsetValue:propertyValue forKey:key];

            }            

        }

    }

   return ret;

}


/////使用方法

NSDictionary *dicJsonData;

EntityObject *objValue;

[objValuereflectDataFromOtherObject:dicJsonData];//这样就可以完成对象的自动赋值了,


//你还在使用 

objValue.value = [dicJsonDataobjectForKey:@"value"];//out了