Runtime-术语与数据结构

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-术语与数据结构)