美文网首页
iOS Runtime (一)

iOS Runtime (一)

作者: 夬大爷 | 来源:发表于2017-07-24 17:11 被阅读0次

    讲到runtime 必须要知道这两个头文件

    #import <objc/runtime.h>  
    #import <objc/message.h>
    

    一、动态创建类

    OBJC_EXPORT void objc_registerClassPair(Class cls) 
        OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0);
    

    动态创建类分为两个过程:
    1、添加成员变量(class_addIvar)。
    2、添加成员方法(sel_registerName,class_addMethod)。

    //开始类的定义
    Class Test= objc_allocateClassPair([NSObject class], "Test", 0);
    //为类添加变量
    class_addIvar(Test, "_name", sizeof(NSString*), log2(sizeof(NSString*)), @encode(NSString*));
    //为类添加方法
    //1.注册名为 test: 的方法
    SEL s = sel_registerName("test:");
    //2.定义函数实现,此处的IMP是函数指针,原型为 typedef id (*IMP)(id, SEL, ...);
    IMP i = imp_implementationWithBlock(^(id this,id some){
        NSLog(@"%@",some);
        return @111;
    });
    //关联Test,s,i,并确认函数签名
    class_addMethod(Test, s, i, "i@:");
    //结束类的定义
    objc_registerClassPair(Test);
    

    调用对象

    //创建对象
    id t = [[Test alloc]init];
    //KVC 动态改变 对象t 中的实例变量
    [t setValue:@"张三" forKey:@"name"];
    NSLog(@"%@",[t valueForKey:@"name"]);
    //调用 t 对象中的 s 方法选择器对于的方法
    id result = objc_msgSend(t, s,@"传送内容");
    NSLog(@"%@",result);
    

    运行结果

    2014-08-15 00:11:00.239 Test[44644:303] 张三
    2014-08-15 00:11:00.240 Test[44644:303] 传送内容
    2014-08-15 00:11:00.241 Test[44644:303] 111
    

    二、Runtime 速查

    objc_
    class_
    object_
    method_
    property_
    protocol_
    ivar_ ,sel_ ,imp_
    

    1.objc_xxx 系列函数
    函数名称 函数作用

    objc_getClass   获取Class对象
    objc_getMetaClass   获取MetaClass对象
    objc_allocateClassPair  分配空间,创建类(仅在 创建之后,注册之前 能够添加成员变量)
    objc_registerClassPair  注册一个类(注册后方可使用该类创建对象)
    objc_disposeClassPair   注销某个类
    objc_allocateProtocol   开辟空间创建协议
    objc_registerProtocol   注册一个协议
    objc_constructInstance  构造一个实例对象(ARC下无效)
    objc_destructInstance   析构一个实例对象(ARC下无效)
    objc_setAssociatedObject    为实例对象关联对象
    objc_getAssociatedObje*ct   获取实例对象的关联对象
    objc_removeAssociatedObjects    清空实例对象的所有关联对象
    objc_msgSend    发送ObjC消息
    

    objc_系列函数关注于宏观使用,如类与协议的空间分配,注册,注销等操作

    2.class_xxx 系列函数
    函数名称 函数作用

    class_addIvar   为类添加实例变量
    class_addProperty   为类添加属性
    class_addMethod 为类添加方法
    class_addProtocol   为类遵循协议
    class_replaceMethod 替换类某方法的实现
    class_getName   获取类名
    class_isMetaClass   判断是否为元类
    objc_getProtocol    获取某个协议
    objc_copyProtocolList   拷贝在运行时中注册过的协议列表
    class_getSuperclass 获取某类的父类
    class_setSuperclass 设置某类的父类
    class_getProperty   获取某类的属性
    class_getInstanceVariable   获取实例变量
    class_getClassVariable  获取类变量
    class_getInstanceMethod 获取实例方法
    class_getClassMethod    获取类方法
    class_getMethodImplementation   获取方法的实现
    class_getInstanceSize   获取类的实例的大小
    class_respondsToSelector    判断类是否实现某方法
    class_conformsToProtocol    判断类是否遵循某协议
    class_createInstance    创建类的实例
    class_copyIvarList  拷贝类的实例变量列表
    class_copyMethodList    拷贝类的方法列表
    class_copyProtocolList  拷贝类遵循的协议列表
    class_copyPropertyList  拷贝类的属性列表
    

    class_系列函数关注于类的内部,如实例变量,属性,方法,协议等相关问题

    3.object_xxx 系列函数
    函数名称 函数作用

    object_copy 对象copy(ARC无效)
    object_dispose  对象释放(ARC无效)
    object_getClassName 获取对象的类名
    object_getClass 获取对象的Class
    object_setClass 设置对象的Class
    object_getIvar  获取对象中实例变量的值
    object_setIvar  设置对象中实例变量的值
    object_getInstanceVariable  获取对象中实例变量的值 (ARC中无效,使用object_getIvar)
    object_setInstanceVariable  设置对象中实例变量的值 (ARC中无效,使用object_setIvar)
    

    objcet_系列函数关注于对象的角度,如实例变量

    4.method_xxx 系列函数
    函数名称 函数作用

    method_getName  获取方法名
    method_getImplementation    获取方法的实现
    method_getTypeEncoding  获取方法的类型编码
    method_getNumberOfArguments 获取方法的参数个数
    method_copyReturnType   拷贝方法的返回类型
    method_getReturnType    获取方法的返回类型
    method_copyArgumentType 拷贝方法的参数类型
    method_getArgumentType  获取方法的参数类型
    method_getDescription   获取方法的描述
    method_setImplementation    设置方法的实现
    method_exchangeImplementations  替换方法的实现
    

    method_系列函数关注于方法内部,如果方法的参数及返回值类型和方法的实现

    5.property_xxx 系列函数
    函数名称 函数作用

    property_getName    获取属性名
    property_getAttributes  获取属性的特性列表
    property_copyAttributeList  拷贝属性的特性列表
    property_copyAttributeValue 拷贝属性中某特性的值
    

    property_系类函数关注与属性*内部,如属性的特性等

    6.protocol_xxx 系列函数
    函数名称 函数作用

    protocol_conformsToProtocol 判断一个协议是否遵循另一个协议
    protocol_isEqual    判断两个协议是否一致
    protocol_getName    获取协议名称
    protocol_copyPropertyList   拷贝协议的属性列表
    protocol_copyProtocolList   拷贝某协议所遵循的协议列表
    protocol_copyMethodDescriptionList  拷贝协议的方法列表
    protocol_addProtocol    为一个协议遵循另一协议
    protocol_addProperty    为协议添加属性
    protocol_getProperty    获取协议中的某个属性
    protocol_addMethodDescription   为协议添加方法描述
    protocol_getMethodDescription   获取协议中某方法的描述
    

    7.ivar_xxx 系列函数
    函数名称 函数作用

    ivar_getName    获取Ivar名称
    ivar_getTypeEncoding    获取类型编码
    ivar_getOffset  获取偏移量
    

    8.sel_xxx 系列函数
    函数名称 函数作用

    sel_getName 获取名称
    sel_getUid  注册方法
    sel_registerName    注册方法
    sel_isEqual 判断方法是否相等
    

    9.imp_xxx 系列函数
    函数名称 函数作用

    imp_implementationWithBlock 通过代码块创建IMP
    imp_getBlock    获取函数指针中的代码块
    imp_removeBlock 移除IMP中的代码块
    

    相关文章

      网友评论

          本文标题:iOS Runtime (一)

          本文链接:https://www.haomeiwen.com/subject/zsibkxtx.html