iOS之消息传递机制

       在Objective-C中使用对象调用方法非常普遍。用Objective-C的术语来讲,这叫做“给某个对象发送某条消息”。顾消息有“名称”或“选择子(selector)”之说。消息是可以接受参数,还可以有返回值。在Objective-C中给对象发送消息是如下的格式:

UIImage *image = [UIImage imageNamed:@""];

        在上面代码中,UIImage叫做方法调用者,也叫做接受者。imageNamed:是方法名,也叫选择子。选择子与参数合起来叫做”消息“。在运行时,编译器会把上面这个格式的方法调用转化为一条标准的C语言函数调用,该函数就是鼎鼎有名的objc_msgSend(),该函数是消息objc里在运行时传递机制中的核心函数,其原型如下:

void objc_msgSend(id self, SEL cmd, ...)

        这是一个参数个数可变的函数。能接收两个或两个以上的参数,第一个参数代表接受者,第二个参数代表选择子。后续参数就是消息中的那些参数,其顺序不变。接受者就是调用方法的对象或者类(本质上类也是对象,叫做类对象)。选择子就是指的方法的名称,选择子和方法这两个词经常交替使用,其实是指的一个意思。运行时,上面Objc的方法调用会被翻译成一条C语言的函数调用,如下:

UIImage *image = objc_msgSend(UIImage,  @selector(imageNamed:), @"")

在上面我们也知道了方法的调用,下面我们来说一说消息传递机制:

        1.首先去该类的方法 cache 中查找,如果找到了就返回它。

        2.如果在 cache 中没有找到,就去该类的方法列表中查找。如果在该类的方法列表中找到了,则将 IMP 返回,并将 它加入 cache 中缓存起来。根据最近使用原则,这个方法再次调用的可能性很大,缓存起来可以节省下次调用再次查找的开销。

        3.如果在该类的方法列表中没找到对应的 IMP,在通过该类结构中的 super_class指针在其父类结构的方法列表中去查找,直到在某个父类的方法列表中找到对应的 IMP,然后返回它,并加入 cache 中。

        4.如果在自身以及所有父类的方法列表中都没有找到对应的 IMP,则看是不是可以进行动态方法决议。

        5.如果动态方法决议没能解决问题,则进行消息转发流程。

你可能感兴趣的:(iOS之消息传递机制)