网上的知识很多,但是知识只有自己过一遍才有意义。
关于消息发送和消息转发,Objective-C 消息发送与转发机制原理讲的很详细。
同时还有这几篇神经病院 Objective-C Runtime 入院第一天—— isa 和 Class,神经病院 Objective-C Runtime 住院第二天——消息发送与转发,
神经病院 Objective-C Runtime 出院第三天——如何正确使用 Runtime,
Runtime又叫运行时,是一套底层的C语言API,是iOS系统的核心之一。开发者在编码过程中,可以给任意一个对象发送消息,在编译阶段只是确定了要向接受者发送这条消息,而接受者将要如何响应和处理这条消息,那就要看运行时来决定了。
SEL类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号
IMP一个函数指针,保存了方法的地址。
IMP和SEL关系:
每一个继承于NSObject的类都能自动获得runtime的支持。在这样的一个类中,有一个isa指针,指向该类定义的数据结构体,这个结构体是由编译器编译时为类(需继承于NSObject)创建的,在这个结构体中有包括了指向其父类类定义的指针以及SEL和IMP的对应表。
消息发送是runtime通过selector快速查找IMP的过程,有了函数指针就可以执行对应的方法实现,消息转发是在查找IMP失败后执行一系列转发流程的慢速通道,如果不做转发处理,则会抛出异常。
在Effective Objective-C 2.0上有一张图很好的解释了消息转发