Runtime,称为运行时.底层C的API.
实例instance/类对象 -> 类class -> 方法method (SEL -> IMP)-> 实现函数
类的数据结构
对象object 类class 方法method
Objective-C类是由Class类型来表示的,指向一个objc_class结构体的指针.
struct objc_class结构体包含super_class(父类指针),name(类的名字),version版本,instance_size实例大小,objc_ivar_list实例变量列表,objc_method_list方法列表,objc_cache缓存,objc_protocol_list协议列表.
类对象就是一个结构体objc_class,objc_class结构体包含了Class isa指针,说明Class本身也是一个对象.
向一个Object-C对象发送消息时,运行时库会根据实例对象的isa指针找到实例所属的类,runtime库会在类的方法列表由super_class找到父类的方法列表直至根类NSObject中去找寻与消息对应的selector指向的方法.找到后运行这个方法.
isa和super_class是找到实现函数的关键映射,isa用于自省确定所属类,super_class确定继承关系.
isa:实例对象 -> 类 -> 元类 -> (不经过父元类)...,根元类指向的是它自己Root class
super_class: 类 -> 父类 ->... -> 根类NSObject,NSObject的superclass指向nil.
操作函数:类对象以class_为前缀, 实例对象以object_为前缀
数据类型: 属性和成员变量要区别
Ivar:成员变量
Property:属性
objc_property_attribute_t(属性的特性有:返回值,noatomic/atomic,set/get方法,dynamic,背后ivar名字,强弱引用)
Method:方法
SEL:方法选择器,一个方法的selector指针,映射方法的名字.OC编译时,会依据每个方法的名字,参数序列,生成一个唯一的整形标识,这个标识就是SEL.
SEL作为IMP的key,存在NSSet中,利用hash快速查询方法.
objc_selector的结构体没有公开,但是打印发现是个字符串
IMP:指向实现函数的指针
Protocol:协议
typedef struct objc_object Protocol;
Category:类别
instanceMethods是object_class的方法列表的子集,class_methods是元类方法列表的子集,有其结构成员可知,没有objc_ivar_list,category为什么不能添加成员变量,可添加属性,只有set/get方法.
给catogory添加方法后,生成method_list,这个方法是倒序添加的,也就是新的方法会优于旧方法执行.