一直在代碼中使用@Selector(method:),但對其原理知之甚少,所以決定去了解一下其原理。
當一個receiver接收消息時,會觸發 objc_msgSend(receiver, SEL op, ...);
首先去runtime底層代碼去查看,這些參數的來源
每一個receiver都是objc_object結構體的實例
通過isa指針找到當前對象的class,并在class的method list中尋找發送的消息
接著看objc_method_list,根據官方文檔的說法,這是一個包含了多個objc_method的數組,objc_method這個結構體中包含了2個重要信息---SEL和IMP, receiver接收消息時傳的參數是SEL類型,SEL主要用來標注方法的名稱,IMP則是方法指針,因為每個方法都有自己的地址,這種方式直接找到方法的地址,效率最高。
這樣就完成了消息的發送過程,歡迎各位指正