iOS runtime 运行时( 二 深谈)

作者: 柠檬草YF | 来源:发表于2016-03-12 17:26 被阅读1785次

Attention!
iOS runtime 运行时( - 俗谈)
iOS runtime 运行时( 二 深谈)
iOS runtime 运行时( 三 深谈)
iOS runtime 运行时( 四 深谈)
逆天的来了******
我们在编程过程中,如果使用到了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<objc/message.h>,然后调用如下的方法

unsigned int outCount =0;
Ivarvars = 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这个属性,如果有就赋值,没有不赋值,

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

最后的打印结果是
********:****孙悟空**
**简单的例子,希望对你有 帮助,后续会继续更新,欢迎大家留言,吐槽**
[JSON 转Model简单的Demo](https://github.com/YFWCQ/Demo "Title")

相关文章

网友评论

  • coderJerry01:可以的,老铁!充分的说明了真的是没必要讲的很深奥,从简单的讲起打好基础最重要!真的是比那些妖艳贱货好!:smile:
    柠檬草YF:@Jason_Developer 哈哈😆
  • ugpass:你这demo找不到地址啊
    柠檬草YF:@ugpass :scream: 现在可以了
  • taosiyu:像我这种新人看你的代码就感觉一目了然
    柠檬草YF:@taosiyu :clap:
  • 叁號選手:以前总觉得这个runtime很高深,现在看你这么一讲解感觉思路清晰了很多,我相信有很多像我这种不是很了解但是很想了解的。真心感谢作者。:+1:
    柠檬草YF:@叁號選手 哈哈,一起学习😄😄
  • 神经骚栋:~~ 五星好评~~~
  • 鼻毛长长:什么场景下要动态改?
    柠檬草YF:@鼻毛长长 比如 一个 Json 字典,要给 一个对象的 所有的属性赋值,根据Key值找到对应的属性名字,把key对应的Value赋值给这个属性,如果属性稍微多点,利用Runtime 去实现这个方法,就大大节省了代码量,现在很多Json转Model的封装方法都是用的Runtime实现的
  • coordinator:比前三个看着有意思,挺详细
  • 08c72fb60b2f:我能说,讲的太浅了吗?配合着讲讲源码,应该会有更多的喜欢
    柠檬草YF:@因为老所以叫我祁哥 恩,后面会有的,我想从最简单的慢慢拓展,谢谢你的建议

本文标题:iOS runtime 运行时( 二 深谈)

本文链接:https://www.haomeiwen.com/subject/opmxlttx.html