1. 相關(guān)數(shù)據(jù)結(jié)構(gòu)
-
objc_object
objc_object -
objc_class
objc_class-
cache_t
- 用于快速查找方法執(zhí)行函數(shù)
- 是可增量擴(kuò)展的哈希結(jié)構(gòu)
- 是局部性原理的最佳應(yīng)用
cache_t -
class_data_bits_t
- class_data_bits_t主要是對(duì)class_rw_t的封裝
- class_rw_t代表類相關(guān)的讀寫信息诗赌、對(duì)class_ro_t的封裝
-
class_ro_t代表類相關(guān)的只讀信息
image
-
-
isa 指針
isa實(shí)例對(duì)象,isa指向其類對(duì)象
類對(duì)象覆山,isa指向其元類對(duì)象
-
method_t
method_t-
Type Encodings
-
const char* types;
image
-
-
-
總體
image
2. 對(duì)象贸人、類對(duì)象狐血、元類對(duì)象
- 類對(duì)象存儲(chǔ)實(shí)例方法列表等信息
-
元類對(duì)象存儲(chǔ)類方法列表等信息
經(jīng)典圖
3. 消息傳遞
-
super
void objc_msgSend(void /* id self, SEL op, ... */) // [self class] => objc_msgSend(self, @selector(class))
void objc_msgSendSuper(void /* struct objc_super *super, SEL op, ... */) struct objc_super { /// Specifies an instance of a class __unsafe_unretained id receiver; }; // [super class] => objc_msgSendSuper(super, @selector(class))
image -
緩存查找
-
給定值是SEL享潜,目標(biāo)值是對(duì)應(yīng)的bucket_t中的IMP
image
-
-
當(dāng)前類中查找
- 已排序好的列表公给,采用二分查找算法查找方法對(duì)應(yīng)執(zhí)行函數(shù)
- 沒有排序的列表逼纸,采用一般遍歷查找方法對(duì)應(yīng)執(zhí)行函數(shù)
-
父類逐級(jí)查找
image -
消息轉(zhuǎn)發(fā)
image
4. Method-Swizzling
方法交換
5. 動(dòng)態(tài)方法添加
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == @selector(test)) {
// 動(dòng)態(tài)添加test方法的實(shí)現(xiàn)
class_addMethod(self, @selector(test), testImp, "v@:");
return YES;
} else {
// 返回父類的默認(rèn)調(diào)用
return [super resolveInstanceMethod:sel];
}
}
6. 動(dòng)態(tài)方法解析
-
@dynamic
- 動(dòng)態(tài)運(yùn)行時(shí)語言將函數(shù)決議推遲帶運(yùn)行時(shí)
- 編譯時(shí)語言在編譯期進(jìn)行函數(shù)決議