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