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
方法确定真实类 -
KVO
中isa
指向了中间类
用法
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;
};
特性
- 方法调用先在缓存中找
- 方法调用存进缓存池,方便下次调用
网友评论