Runtime-術(shù)語與數(shù)據(jù)結(jié)構(gòu)
RunTime簡稱運行時翎冲,它純C語言API
OC的函數(shù)調(diào)用為消息發(fā)送:為動態(tài)調(diào)用過程簸州,編譯時缠借,有聲明函數(shù),就不報錯跳夭,運行時根據(jù)函數(shù)名稱找到對應(yīng)實現(xiàn)
和
C語言
的區(qū)別:C語言
是編譯時決定調(diào)用哪個函數(shù)
1涂圆、SEL
描述
- 它是selector在 Objc 中的表示(Swift 中是 Selector 類)
- selector 對方法名進(jìn)行包裝,以便找到對應(yīng)的方法實現(xiàn)
- 編譯時根據(jù)方法名币叹,參數(shù)序列生成的唯一標(biāo)示
定義
typedef struct objc_selector *SEL; // 映射到方法的 C 字符串
內(nèi)部實現(xiàn)(猜想)
struct objc_selector {
char name[64 or ...];
...
};
特性
- 作為IMP的key,存儲在NSSet中
- OC中同一類不能有同名的SEL润歉,原因在上
- 不同類可以有相同的方法名:因為class各種對應(yīng)自己的方法列表
用法
-
Objc
編譯器器命令@selector()
:SEL selector = @selector(description);
- Runtime函數(shù):
SEL selector2 = sel_registerName("description");
2、id
描述
- 參數(shù)類型颈抚,指向某個類實例的指針
定義
typedef struct objc_object *id;
內(nèi)部實現(xiàn)
struct objc_object { Class isa; }; // isa找到所屬類
特性
-
isa
踩衩,不總指向真實所屬類 - 調(diào)用
-class
方法確定真實類 -
KVO
中isa
指向了中間類
用法
3、Class
描述
- 指向 objc_class 結(jié)構(gòu)體的指針
定義
typedef struct objc_class *Class;
內(nèi)部實現(xiàn)
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class // 父類
const char *name // 類名
long version // 類的版本信息贩汉,默認(rèn)為0
long info // 類信息九妈,供運行期使用的一些位標(biāo)識
long instance_size // 類的實例變量大小
struct objc_ivar_list *ivars // 類的成員變量鏈表
struct objc_method_list **methodLists // 方法定義的鏈表
struct objc_cache *cache // 方法緩存
struct objc_protocol_list *protocols // 協(xié)議鏈表
#endif
} OBJC2_UNAVAILABLE;
特性
- 存儲元類及父類指針
- 存儲 方法,實例雾鬼,協(xié)議鏈表
- 存儲方法緩存、類名宴树,版本等信息策菜。
用法
- 可根據(jù)isa找到Class,進(jìn)而進(jìn)行方法調(diào)用等操作
4、Method
描述
- Method 代表類中某個方法的類型
定義
typedef struct objc_method *Method;
內(nèi)部實現(xiàn)
typedef struct objc_method *Method;
struct objc_method {
SEL method_name ; // 方法名
char *method_types ; // 參數(shù)類型
IMP method_imp ; // 方法實現(xiàn)
}
特性
- 運行時才將SEL和IMP綁定, 動態(tài)配置方法
- 通過SEL可找到對應(yīng)的IMP實現(xiàn)
5又憨、IMP
描述
- 它是編譯器生成的函數(shù)指針
定義
typedef id (*IMP)(id, SEL, ...);
特性
- IMP指針指向了方法的實現(xiàn)
- 通過SEL取得IMP后翠霍,得到方法進(jìn)行調(diào)用
6、Ivar
描述
- 表示成員變量的類型
定義
typedef struct objc_ivar *Ivar;
內(nèi)部實現(xiàn)
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)
- 獲取協(xié)議屬性:objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)
8、Cache
描述
- 方法緩存
定義
typedef struct objc_cache *Cache
內(nèi)部結(jié)構(gòu)
struct objc_cache {
// 緩存bucket的總數(shù)
unsigned int mask /* total = mask + 1 */ OBJC2_UNAVAILABLE;
// 實際緩存bucket的總數(shù)
unsigned int occupied OBJC2_UNAVAILABLE;
// 指向Method數(shù)據(jù)結(jié)構(gòu)指針的數(shù)組
Method buckets[1] OBJC2_UNAVAILABLE;
};
特性
- 方法調(diào)用先在緩存中找
- 方法調(diào)用存進(jìn)緩存池祸憋,方便下次調(diào)用