Objc的方法調用基于消息發送機制。即Objc中的方法調用,在底層實際都是通過調用objc_msgSend方法向對象消息發送消息來實現的。在iOS中, 實例對象的方法主要存儲在類的方法列表中,類方法則是主要存儲在原類中。
? ? ?向對象發送消息,核心就是找到對應的方法,然后傳入參數執行。
? ? ?其具體過程是:
- 確定class已經加載
- 從cache中通過hash查找方法
- 從類的方法列表中查找
- 從父類中查找
- 若方法列表是排序過的,?則采用二分法查找;若方法列表未排序,則采用遍歷查找。
- 若找到方法,執行之;否則,進入消息轉發流程。
? ? ?需要注意的是, 向super對象發送消息,調用的不是objc_msgSend方法。
NSLog(@"NSStringFromClass([self class])=%@",NSStringFromClass([self class]));
NSLog(@"NSStringFromClass([super class])=%@",NSStringFromClass([super class]));打印結果:
NSStringFromClass([self class])=BankViewController
NSStringFromClass([super class])=BankViewController
? ? ? ?為什么 [super class]返回的也是BankViewController呢? 這是因為, super結構體中的receiver指針其實指向的也是self,只是向super發送消息調用的是objc_msgSendSuper方法,該方法在執行消息傳遞時,會調用查找自己類中的方法,直接從父類開始查找。?