目前开发中,面对大量的返回参数,几乎都是用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
网友评论