首页 > 代码库 > iOS反射机制: objc_property_t的使用
iOS反射机制: objc_property_t的使用
iOS属性反射:说白了,就是将两个对象的所有属性,用动态的方式取出来,并根据属性名,自动绑值。(注意:对象的类,如果是派生类,就得靠其他方式来实现了,因为得到不该基类的属性。)
常用的反射方式,有如下两种:
从一个自定义实体类->自定义实体类
从一个NSDictionary->自定义实体类(此方式最最常用,如网络Json数据会组成NSDictionary。sqlite查询数据,可以用第三方组件组成NSDictionary)
直接上码,(这里码在NSObject类别中)
获取对象所有属性:
- (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;
}
- (BOOL)reflectDataFromOtherObject:(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 = http://www.mamicode.com/[dataSource valueForKey:key];
//该值不为NSNULL,并且也不为nil
if (![propertyValue isKindOfClass:[NSNull class]] && propertyValue!=nil) {
[self setValue:propertyValue forKey:key];
}
}
}
return ret;
}
/////使用方法
NSDictionary *dicJsonData;
EntityObject *objValue;
[objValue reflectDataFromOtherObject:dicJsonData]; //这样就可以完成对象的自动赋值了,
//你还在使用下面的方法吗?
objValue.value = http://www.mamicode.com/[dicJsonData objectForKey:@"value"];
//out了!
iOS反射机制: objc_property_t的使用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。