iOS总结-Runtime篇之类的动态配置

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,这个方法是倒序添加的,也就是新的方法会优于旧方法执行.

参考文章:https://www.jianshu.com/p/6ebda3cd8052

https://www.jianshu.com/p/f900de4a1495

猜你喜欢

转载自blog.csdn.net/qq_28551705/article/details/82912326