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