iOS runtime 运行时( 二 深谈)

来源:互联网 发布:找工作什么软件最靠谱 编辑:程序博客网 时间:2024/06/05 14:09

Attention!逆天的来了
我们在编程过程中,如果使用到了runtime(运行时),我们几乎都是想动态的改变这个类的信息,包括方法,属性,balabala的,并且获得这个类的一些信息,等等,下面我们就来看看怎么通过runtime提供的方法,来达到这些目的
1). 获取 这个类的所有属性
.h 文件

@interface RTObj :NSObject@property(nonatomic,copy)NSString*name;@property(nonatomic,copy)NSString*webUrl;@property(nonatomic,copy)NSString*imageUrl;@property(nonatomic,copy)NSString*type;-(void)sort;@end

.m 文件

#import"RTObj.h"@implementationRTObj@end

获取这个类的所有属性,首先包含import

unsigned int outCount =0;Ivar*vars = class_copyIvarList([RTObj class], &outCount);//获取到所有的成员变量列表//遍历所有的成员变量for(int i =0; i < outCount; i++) {Ivar ivar= vars[i];//取出第i个位置的成员变量constchar*propertyName = ivar_getName(ivar);//获取变量名constchar*propertyType = ivar_getTypeEncoding(ivar);//获取变量编码类型printf("---%s--%s\n", propertyName, propertyType);//或者NSLog(@"---%s--%s\n", propertyName, propertyType);}

打印结果
—_name–@”NSString”
—_webUrl–@”NSString”
—_imageUrl–@”NSString”
—_type–@”NSString”
然后你就可以 自己去扩展自己的编程思路了,需要注意的是,父类的属相并不会打印出来,也就是 通过这个方法,获取不到父类的 属性
2).改变该类的对象的某一个属性的值
有这样一个对象

RTObj*rtObj = [[RTObj alloc]init];

现在通过 运行时提供的方法,来检查里面有没有 name这个属性,如果有就赋值,没有不赋值,

RTObj*rtObj = [[RTObjalloc]init];unsignedintoutCount =0;Ivar*vars =class_copyIvarList([rtObjclass], &outCount);//获取到所有的成员变量列表//遍历所有的成员变量for(inti =0; i < outCount; i++) {Ivarivar = vars[i];//取出第i个位置的成员变量constchar*propertyName =ivar_getName(ivar);//获取变量名constchar*propertyType =ivar_getTypeEncoding(ivar);//获取变量编码类型NSString*proOcName = [NSStringstringWithUTF8String:propertyName];if([proOcNameisEqualToString:@"_name"]){object_setIvar(rtObj, ivar,@"孙悟空");}}NSLog(@"******:%@",rtObj.name);

最后的打印结果是
:孙悟空
简单的例子,希望对你有 帮助,后续会继续更新,欢迎大家留言,吐槽

0 0