OC-Runtime温故知新
每个java应用程序都有一个runtime类实例,使应用程序能够与其运行的环境相连接。可以通过getRuntime 方法获取当前运行时,应用程序不能自己创建runtime类实例。Runtime 没有构造方法,说明不能创建对象。当这个类没有构造方法而且有非静态的方法,说明,这个类至少有一个静态方法,而且返回的是该类的对象。runtime就提供了一个静态的获取对象的方法,并且这个方法采用了单例模型的设计模式,保证了唯一性。
面试问答:
问:你用过单例吗?在哪里见过或者用过单例?
答:runtime就是一个单例的例子。
Runtime的最大优势:能拿到与内存数的数据。有的应用可以拿到虚拟机的内存。
- Runtime的简介
runtime就是运行时。OC是运行时机制,其中最主要的是消息机制。
对于C语言而言,在编译的时候,就会决定调用了哪个函数。也就是说,在编译的时候,C语言调用未实现的函数会报错。
对于OC来说,是属于动态调用过程,在编译的时候并不能决定调用哪个函数。只有真正运行的时候才根据函数名去获取该方法的函数。也就说,在编译的时候,OC可以调用任何方法,即使这个函数并未实现,只要声明了就可以。
- Runtime的交换方法
-
//这个方法只调用一次,就是分类加载的时候 + (void)load { // 交换方法的实现 }
- Runtime获取对象的属性
-
Iva 成员变量 Method 方法 Property 属性 Protocol 协议
思路:
1.创建NSObject的分类,添加一个获取对象属性的方法:
+ (NSArray *)getPropertyList;
2.用class_copyPropertyList这个方法获取类的所有属性,但是这个是C语言的,需要转化一下
- 用runtime添加属性值
-
假设创建了一个person类,需要在分类上添加一个属性height,步骤如下: 1.添加一个person的分类 在分类的.h 上 添加一个属性 @interface Person (category) @property (nonatomic, copy) NSString *height; @end 在分类的.m 上 添加如下的代码 (需要导入头文件:#import <objc/message.h>) - (void)setHeight:(NSString *)height { //保存属性到系统的类 //产生关联,让某个对象(height)与当前对象的属性的height产生关联 //object:给哪个对象添加属性 //key:属性名 //value:属性值 //policy:策略 objc_setAssociatedObject(self, @"height", height, OBJC_ASSOCIATION_COPY_NONATOMIC); } - (NSString *)height { return objc_getAssociatedObject(self, @"height"); }