iOS runtime总结

来源:互联网 发布:天猫双11数据直播网址 编辑:程序博客网 时间:2024/06/09 20:31

    runtime 是一套比较底层的C级别的API,属于一个C语言库,报行了很多底层的C语言API。

    我们所有的OC代码,在调用时,最终都会转成runtime的C语言代码,runtime算是OC的幕后工作者。

    举个例子:[[foo alloc] init]   ----->objc_msgSend(objec_msgSend("foo","alloc"),"init");

    runtime属于OC的底层,可以进行易学OC不好是新的非常底层的操作。

    1.在程序运行课程中,动态创建一个类(比如KVO的底层实现)

    2.在程序运行过程中,动态的为某个方法为谋各类添加属性、方法,修改属性值或方法

    3.遍历一个类的所有成员变量和所有方法


     一般的动态语言为解释性语言,但OC能做到即使编译型语言,有事动态语言,得益于Runtime机制。

     runtime如何使用:

     1.class_copyPropertyList 获取一份拷贝的成员列表数组

     2.property_getName 获取成员名称

     3.class_getInstanceVariable 获取成员对象的lvar

     4.object_getlvar 从lvar对象中取值

     5.object_setlvar 赋值函数

    
    顺便贴点小知识:Objective-C运行时定义了几种重要的类型。
        Class:定义Objective-C类
        Ivar:定义对象的实例变量,包括类型和名字。
        Protocol:定义正式协议。
        objc_property_t:定义属性。叫这个名字可能是为了防止和Objective-C 1.0中的用户类型冲突,那时候还没有属性。
        Method:定义对象方法或类方法。这个类型提供了方法的名字(就是**选择器**)、参数数量和类型,以及返回值(这些信息合起来称为方法的**签名**),还有一个指向  代码的函数指针(也就是方法的**实现**)。
        SEL:定义选择器。选择器是方法名的唯一标识符。
        IMP:定义方法实现。这只是一个指向某个函数的指针,该函数接受一个对象、一个选择器和一个可变长参数列表(varargs),返回一个对象

       

#import <objc/runtime.h>
// propertyCount 成员属性的数量    unsigned int propertyCount = 0;
objc_property_t *properties = class_copyPropertyList([self class], &propertyCount);//获取本类的成员变量的列表,使我们自己添加的属性,不是系统原先就有的 for (unsigned int i = 0; i < propertyCount; i++) { objc_property_t property = properties[i]; //获取成员的名称 NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; NSLog(@"propertyName = %@ -- 成员名称",propertyName); //获取成员内容的Ivar Ivar iVar = class_getInstanceVariable([self class], [propertyName UTF8String]); //其实上面那行获取代码是为了保险起见,基本是获取不到内容的。因为成员的名称默认会在前面加"_" , if (iVar == nil) { iVar = class_getInstanceVariable([self class], [[NSString stringWithFormat:@"_%@",propertyName] UTF8String]); } // 取值 id propertyVal = object_getIvar(self, iVar);//确定属性的值必须是对象才能用这个方法,不然会崩溃
NSLog(@"propertyVal = %@ --值",propertyVal);
 

http://blog.cocoabit.com/blog/2014/10/06/yi-li-jieobjective-cruntime/

http://www.tuicool.com/articles/R3Aryau

0 0
原创粉丝点击