runtime是实现机制是什么?一般用于干什么?下面笔者就分享给大家了,有什么不足之处,希望大家指点建议。
runtime 是一套比较底层的纯C语言的API,属于一个C语言库,包含了很多底层C语言的API。
在我们平常写的oc代码中,程序运行的过程中,最终转变成runtime的C语言代码,runtime是OC的幕后工作者,
比如说:下面一个创建对象的方法中
OC:
person = [Person alloc] init];
runtime:
objc_msgSend(objc_msgsend("Person","alloc"),"init")
它是用来干上面的呢?
1.在程序运行的过程中,动态创建一个类(比如说KVO的底层实现)
2.在程序运行的过程中,动态的为某一个类添加属性/方法,修改属性值/方法
3.遍历一个类的所有成员变量(属性)/所有的方法:列如:我们需要对一个类的属性进行归档解档的时候,属性特别的多,这时候,我们就会写很多对应的代码,但是如果使用了
runtime就可以动态的设置了,
例如:Person.h的文件如下所示
@property (nonatomic,assign)int age;
@property (nonatomic,assign)int height;
@property (nonatomic,copy)NSString *name;
@property (nonatomic,assign)int age3;
@property (nonatomic,assign)int heigh3t;
@property (nonatomic,assign)int age4;
@property (nonatomic,assign)int heigh4;
Person.m实现文件的内容如下
(void)encodeWithCoder:(NSCoder )encoder
{
unsigned int count = 0;
Ivar ivars = class_copyIvarList([PYPerson class], &count);
for (int i = 0; i<count; i++) {
// 取出i位置对应的成员变量
Ivar ivar = ivars[i];
// 查看成员变量
const char *name = ivar_getName(ivar);
// 归档
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[encoder encodeObject:value forKey:key];
}
free(ivars);
}
(id)initWithCoder:(NSCoder *)decoder
{
if (self = [super init]) {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([PYPerson class], &count);
for (int i = 0; i<count; i++) {
// 取出i位置对应的成员变量
Ivar ivar = ivars[i];
// 查看成员变量
const char *name = ivar_getName(ivar);
// 归档
NSString *key = [NSString stringWithUTF8String:name];
id value = [decoder decodeObjectForKey:key];
// 设置到成员变量身上
[self setValue:value forKey:key];
}
free(ivars);
}
return self;
}
学习,runtime机制首先要了解下面几个问题
1.头文件,利用头文件我们可以查看到runtime中的各个方法!
2.相关应用
(1)NSCoding(归档和解档,利用runtime遍历模型对象的所有属性)
(2)字典->模型(利用runtime遍历模型对象的所有属性,根据属性名从字典中取出对应的值,设置到模型的属性上)
(3)KVO(利用runtime动态产生一个类)
(4)用于封装框架(想怎么改就怎么改)
这就是runtime机制的主要运行方向
3.相关的函数
(1)objc_msgSend:给对象发送消息
(2)class_copyMethodList:遍历某个类所有的方法
(3)class_copyIvarList:遍历某个类所有的成员变量
这是我们学习runtime必须知道的函数
4.必备常识
(1)Ivar:成员变量
(2)Method:成员方法
从上面例子中我们看到我们定义的成员变量,如果要是动态创建方法,可以使用Method,也许,看到这里,你是否对runtime有了更深入的了解?