美文网首页
Runtime-术语与数据结构

Runtime-术语与数据结构

作者: 天之鱼 | 来源:发表于2018-09-12 10:28 被阅读0次

    Runtime-术语与数据结构

    • RunTime简称运行时,它纯C语言API

    • OC的函数调用为消息发送:为动态调用过程,编译时,有声明函数,就不报错,运行时根据函数名称找到对应实现

    • C语言的区别:C语言是编译时决定调用哪个函数

    1、SEL

    描述

    • 它是selector在 Objc 中的表示(Swift 中是 Selector 类)
    • selector 对方法名进行包装,以便找到对应的方法实现
    • 编译时根据方法名,参数序列生成的唯一标示

    定义

    typedef struct objc_selector    *SEL; // 映射到方法的 C 字符串
    

    内部实现(猜想)

    struct objc_selector  {
    char name[64 or ...];
    ...
    };
    

    特性

    • 作为IMP的key,存储在NSSet中
    • OC中同一类不能有同名的SEL,原因在上
    • 不同类可以有相同的方法名:因为class各种对应自己的方法列表

    用法

    • Objc 编译器器命令@selector(): SEL selector = @selector(description);
    • Runtime函数: SEL selector2 = sel_registerName("description");

    2、id

    描述

    • 参数类型,指向某个类实例的指针

    定义

    typedef struct objc_object *id;
    

    内部实现

    struct objc_object { Class isa; }; // isa找到所属类
    
    

    特性

    • isa,不总指向真实所属类
    • 调用-class 方法确定真实类
    • KVOisa指向了中间类

    用法

    3、Class

    描述

    • 指向 objc_class 结构体的指针

    定义

    typedef struct objc_class *Class;
    

    内部实现

    struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;
    #if !__OBJC2__
    Class super_class      // 父类
    const char *name    // 类名
    long version       // 类的版本信息,默认为0
    long info          // 类信息,供运行期使用的一些位标识
    long instance_size                              // 类的实例变量大小
    struct objc_ivar_list *ivars                    // 类的成员变量链表
    struct objc_method_list **methodLists    // 方法定义的链表
    struct objc_cache *cache                   // 方法缓存
    struct objc_protocol_list *protocols    // 协议链表
    #endif
    } OBJC2_UNAVAILABLE;
    
    
    

    特性

    • 存储元类及父类指针
    • 存储 方法,实例,协议链表
    • 存储方法缓存、类名,版本等信息。

    用法

    • 可根据isa找到Class,进而进行方法调用等操作

    4、Method

    描述

    • Method 代表类中某个方法的类型

    定义

    typedef struct objc_method *Method;
    

    内部实现

    typedef struct objc_method *Method;
    struct objc_method {
    SEL method_name      ;  // 方法名
    char *method_types    ; // 参数类型
    IMP method_imp         ;  // 方法实现
    }
    
    

    特性

    • 运行时才将SEL和IMP绑定, 动态配置方法
    • 通过SEL可找到对应的IMP实现

    5、IMP

    描述

    • 它是编译器生成的函数指针

    定义

    typedef id (*IMP)(id, SEL, ...);
    

    特性

    • IMP指针指向了方法的实现
    • 通过SEL取得IMP后,得到方法进行调用

    6、Ivar

    描述

    • 表示成员变量的类型

    定义

    typedef struct objc_ivar *Ivar;
    

    内部实现

    struct objc_ivar {
        char *ivar_name OBJC2_UNAVAILABLE; // 变量名。
        char *ivar_type OBJC2_UNAVAILABLE; // 变量类型。
        int ivar_offset OBJC2_UNAVAILABLE; // 基地址偏移量,在对成员变量寻址时使用。
    #ifdef __LP64__
        int space OBJC2_UNAVAILABLE;
    #endif
    }
    

    7、Property

    描述

    • 表示属性

    定义

    typedef struct objc_property *Property;
    typedef struct objc_property *objc_property_t;//这个更常用
    

    用法

    • 获取类属性:objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)
    • 获取协议属性:objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)

    8、Cache

    描述

    • 方法缓存

    定义

    typedef struct objc_cache *Cache
    

    内部结构

    struct objc_cache {
    // 缓存bucket的总数
    unsigned int mask /* total = mask + 1 */ OBJC2_UNAVAILABLE;
    // 实际缓存bucket的总数
    unsigned int occupied  OBJC2_UNAVAILABLE;
    // 指向Method数据结构指针的数组
    Method buckets[1]                                        OBJC2_UNAVAILABLE;
    };
    

    特性

    • 方法调用先在缓存中找
    • 方法调用存进缓存池,方便下次调用

    相关文章

      网友评论

          本文标题:Runtime-术语与数据结构

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