码迷,mamicode.com
首页 > 其他好文 > 详细

runtime运行机制

时间:2015-05-09 11:50:31      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:runtime 运行时

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 age2;
@property (nonatomic,assign)int heigh2t;

@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有了更深入的了解?





runtime运行机制

标签:runtime 运行时

原文地址:http://blog.csdn.net/jianglonghuang/article/details/45599047

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!