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 文件 @implementationRTObj
@end
获取这个类的所有属性,首先先包含#import<objc/message.h>,然后调用如下的方法 unsigned int outCount =;
Ivar*vars = class_copyIvarList([RTObj class], &outCount);//获取到所有的成员变量列表
//遍历所有的成员变量
for(int i =; 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 = [[RTObj alloc]init];
unsigned int outCount =;
Ivar*vars =class_copyIvarList([rtObj class], &outCount);//获取到所有的成员变量列表
//遍历所有的成员变量
for(inti =; i < outCount; i++) {
Ivarivar = vars[i];//取出第i个位置的成员变量
constchar*propertyName =ivar_getName(ivar);//获取变量名
constchar*propertyType =ivar_getTypeEncoding(ivar);//获取变量编码类型
NSString*proOcName = [NSString stringWithUTF8String:propertyName];
if([proOcName isEqualToString:@"_name"])
{
object_setIvar(rtObj, ivar,@"孙悟空");
}
}
NSLog(@"******:%@",rtObj.name);
最后的打印结果是
**:**孙悟空
iOS runtime 运行时( 二 )的更多相关文章
- ios - runtime运行时应用---交换方法
runtime运行时用法之一 --- 交换类的方法,此处简单写了把系统的UIView的setBackgroundColor的方法换成了自定义的pb_setBackgroundColor 首先创建UIV ...
- iOS runtime 运行时( - )
谈到运行时,相对应的就有编译时: 1).运行时-- 直到程序运行时才去确定一个对象的具体信息,并且可以改变这个类的具体信息,包括它的方法,变量等等: 2).编译时-- 是在程序运行之前,编译的时候,就 ...
- iOS runtime 运行时( 三 )
上一篇 聊的是: 在不知道一个对象有什么属性的情况下, 获取对象的所有属性,然后可以改变属性的值, 今天我们谈谈 怎么通过Category(类别)+runtime 给一个类 添加一个新的属性,一般情况 ...
- iOS开发——高级特性&Runtime运行时特性详解
Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...
- Runtime运行时的那点事儿
注:本文是对 Colin Wheeler 的 Understanding the Objective-C Runtime 的翻译. 初学 Objective-C(以下简称ObjC) 的人很容易忽略一个 ...
- runtime 运行时机制 完全解读
runtime 运行时机制 完全解读 目录[-] import import 我们前面已经讲过一篇runtime 原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!希望对读者有所帮助! ...
- 编译器设计-RunTime运行时环境
编译器设计-RunTime运行时环境 Compiler Design - Run-Time Environment 作为源代码的程序仅仅是文本(代码.语句等)的集合,要使其活动,它需要在目标计算机上执 ...
- iOS开发之runtime运行时机制
最近参加三次面试都有被问到runtime,因为不太懂runtime我就只能支支吾吾的说点零碎.我真的好几次努力想看一看runtime的知识,因为知道理解它对理解OC代码内部变化有一定帮助,不过真心觉得 ...
- Objective-C Runtime 运行时之二:成员变量与属性
类型编码(Type Encoding) 作为对Runtime的补充,编译器将每个方法的返回值和参数类型编码为一个字符串,并将其与方法的selector关联在一起.这种编码方案在其它情况下也是非常有用的 ...
随机推荐
- C#.Net 导出Excel 之单元格 相关设置
range.NumberFormatLocal = "@"; //设置单元格格式为文本range = (Range)worksheet.get_Range("A1 ...
- 实现系统函数time,获取当前时间与UTC的间隔
因种种原因,最近很少上cnblogs了.刚写了一个实现time的函数,可以通过该函数获取当前时间与1970年1月1日 0时0分0秒的差值,精确到秒,可以用在某些没有时候使用time不正确而不得不调用硬 ...
- c#动态加载dll文件
1.在写一个记录日志到文件中的类库(生成dll文件copy到一个目录中去,然后在主函数的appconfig中去配置. using System; using System.Collections.Ge ...
- CISCO3560 VLAN配置实例
1.注意事项 1.1.交换机启动需要大约4-5分钟: 1.2.网线插入交换机接口从黄变为绿需要大约1-2分钟,即进入正常工作模式: 1.3.建议使用XP系统进行操作,2003默认没有安装超级终端,需要 ...
- UIView的autoresizingMask属性
今天做相册列表的时候,发现有些 UITableViewController 属性不好记忆,然后就查找了一些资料.做一下备份. 在 UIView 中有一个autoresizingMask的属性,它对应的 ...
- eclipse查看 rt.jar 源码
源码位置: %JAVA_HOME%/src.zip step1: step2: step3:
- reactor设计模式
reactor介绍 reactor的工作模式就像它的名字一样,是一种反射模式,当事件发生时,根据发生的事件调用注册的处理器. Reactor的优点和应用 Reactor最常用于非阻塞的socket 传 ...
- OpenStack Hacker养成指南
0 阅读指南 希望本文能够解开你心中萦绕已久的心结,假如是死结,请移步到 https://wiki.openstack.org/wiki/Main_Page 学习OpenStack其实就是学习各种Py ...
- win10的安装、win10启动盘制作
需要的材料 win10映像 U盘 UltraISO软件 1.下载对应的win10映像 有64位和32位可选(自己找地方下) 2.下载UltraISO软件 3.准备一只U盘,插入电脑 4.启动Ultra ...
- ie7下z-index失效问题解决方法(详细分析)
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-04-03) 点评:绝对定位元素的“有定位属性(relative或absolute)的父元素”在渲染层次时起到了主要作用,前面 ...