1. 程式人生 > >iOS總結-Runtime篇之類的動態配置

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