一直在代码中使用@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则是方法指针,因为每个方法都有自己的地址,这种方式直接找到方法的地址,效率最高。
这样就完成了消息的发送过程,欢迎各位指正