Runtmie--运行时机制
是一套底层的纯c语言的API,在oc程序运行过程中,转换成runtime的c语言代码。大多数情况下,runtime是在幕后工作。
举个例子:
oc代码:
[ [ Person alloc ] init ];
转化成runtime的c语言代码为:
objc_msgsend( objc_msgsend("Person","alloc") , "init" )
OC可以再三个不同层面跟运行时系统交互:
下面列举runtime相关的应用:
利用runtime可以进行一些非常底层的操作,这些操作一般是无法通过oc实现的。
(1)NSCoding:
在模型归档和解档的时候,利用runtime遍历模型对象的所有属性。
(2)字典转模型:
利用runtime遍历模型对象的所有属性,根据属性名从字典中取出对应值,设置到对应的模型属性上。推荐查看mj的MJExention。
(3)KVO:
利用runtime动态产生一个类
(4)用于封装框架
(5)动态的为某个类添加属性,方法,或者是修改属性值,方法。例如ivar_getName,class_addMethod
下面有几个runtime函数是比较基本的,在使用这些函数前,先要导入对应的头文件:<objc/runtime.h>,<objc/message.h>
在此之前,其实通过两个比较特别的单词,即可以看出runtime方法的用处,一个是Method,一个是IVar。Mehtod对应的是方法,IVar 对应的是变量。
(1)objc_msgsend:给对象发送消息
(2)objc_copyMethodList:遍历某个类所有的方法
(3)objc_copyIVarList:遍历某个类所有的方法
接下来结合runtime的函数和上面所说的runtime应用中的第一点,归档举一个例子:
首先要导入<objc/runtime.h>,
接着在你所需归档的模型的m文件里面,实现encodeWithCoder:(NSCoder *)aCoder方法,
- (void)encodeWithCoder:(NSCoder *)aCoder
{
unsignedint count = 0;
//获取这个模型的所有属性
Ivar *ivars =class_copyIvarList([PushModelclass], &count);
for(int i =0; i<count; i++)
{
Ivar ivar = ivars[i];
//获取属性名
constchar *name = ivar_getName(ivar);
NSString *key = [NSStringstringWithUTF8String:name];
id value = [selfvalueForKey:key];
[aCoder encodeObject:valueforKey:key];
}
//释放
free(ivars);
}
----------------------------------对runtime的基本理解---------------------------------------