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

1). 获取 这个类的所有属性

iOS runtime 运行时( 二 )_oociOS runtime 运行时( 二 )_ooc_02

1 .h 文件 2  3 @interface RTObj :NSObject 4 @property(nonatomic,copy)NSString*name; 5 @property(nonatomic,copy)NSString*webUrl; 6 @property(nonatomic,copy)NSString*imageUrl; 7 @property(nonatomic,copy)NSString*type; 8 -(void)sort; 9 @end

View Code iOS runtime 运行时( 二 )_oociOS runtime 运行时( 二 )_ooc_02

1 .m 文件  2   3 @implementationRTObj  4 @end  5 获取这个类的所有属性,首先先包含#import<objc/message.h>,然后调用如下的方法  6   7 unsigned int outCount =0;  8 Ivar*vars = class_copyIvarList([RTObj class], &outCount);//获取到所有的成员变量列表  9 //遍历所有的成员变量 10 for(int i =0; i < outCount; i++) { 11 Ivar ivar= vars[i];//取出第i个位置的成员变量 12 constchar*propertyName = ivar_getName(ivar);//获取变量名 13 constchar*propertyType = ivar_getTypeEncoding(ivar);//获取变量编码类型 14 printf("---%s--%s\n", propertyName, propertyType); 15 //或者NSLog(@"---%s--%s\n", propertyName, propertyType); 16 }

View Code


打印结果

---_name--@"NSString"

---_webUrl--@"NSString"

---_imageUrl--@"NSString"

---_type--@"NSString"

然后你就可以 自己去扩展自己的编程思路了,需要注意的是,父类的属相并不会打印出来,也就是 通过这个方法,获取不到父类的 属性

2).改变该类的对象的某一个属性的值

有这样一个对象


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



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

iOS runtime 运行时( 二 )_oociOS runtime 运行时( 二 )_ooc_02

1 RTObj*rtObj = [[RTObj alloc]init];  2 unsigned int outCount =0;  3 Ivar*vars =class_copyIvarList([rtObj class], &outCount);//获取到所有的成员变量列表  4 //遍历所有的成员变量  5 for(inti =0; i < outCount; i++) {  6 Ivarivar = vars[i];//取出第i个位置的成员变量  7 constchar*propertyName =ivar_getName(ivar);//获取变量名  8 constchar*propertyType =ivar_getTypeEncoding(ivar);//获取变量编码类型  9 NSString*proOcName = [NSString stringWithUTF8String:propertyName]; 10 if([proOcName isEqualToString:@"_name"]) 11 { 12 object_setIvar(rtObj, ivar,@"孙悟空"); 13 } 14 } 15 NSLog(@"******:%@",rtObj.name);

View Code


最后的打印结果是

**:**孙悟空