ios开发-Runtime理解,应用,基本知识

来源:互联网 发布:semaphore c语言 编辑:程序博客网 时间:2024/06/09 23:51

Runtmie--运行时机制

是一套底层的纯c语言的API,在oc程序运行过程中,转换成runtime的c语言代码。大多数情况下,runtime是在幕后工作。

举个例子:

oc代码:

[ [ Person alloc ] init ];

转化成runtime的c语言代码为:

objc_msgsend( objc_msgsend("Person","alloc") , "init" ) 


OC可以再三个不同层面跟运行时系统交互:

  1. oc源程序
  2. 通过NSObject类中定义的方法
  3. 直接调用runtime函数


下面列举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的基本理解---------------------------------------


0 0
原创粉丝点击