返回

objc_msgSend 消息转发流程探究三

IOS

消息转发流程

在前面《objc_msgSend 消息转发流程探究二》中,我们最后提到,当在缓存和方法列表中都找不到对应的 imp 的时候,会把 imp 赋值为 forward_imp 并返回。

// 如果在方法缓存表中没找到,进入方法列表搜索
if (!class->cache_t->methodLists[cmd->sel_id]) {
    class_t **tmpClass = &class;
    do {
        class_t *curClass = *tmpClass;
        if (!class_performSuperclassMethod(curClass, sel, fwdPtr)) {
            class->cache_t->methodLists[cmd->sel_id] = fwdPtr;
            if (fwdPtr) {
                IMP tmpIMP = (IMP)fwdPtr->method_imp;
                _dispatch_once(&class->cache_t->once, initialize_cache_table);
                class->cache_t->impCache[cmd->sel_id] = tmpIMP;
            }
            return tmpIMP;
        }
        tmpClass = &class->superclass;
    } while (*tmpClass);
    
    // 在类和父类都找不到方法的时候,尝试消息转发
    class->cache_t->methodLists[cmd->sel_id] = (void*)forward_imp;
    return forward_imp;
}

这里我们看到,当在类和父类都找不到方法的时候,会尝试消息转发,并将 imp 赋值为 forward_imp。

消息转发机制

消息转发机制是 Objective-C 中一种非常强大的机制,它允许我们将消息转发到其他对象或类上。这使得我们可以很方便地实现一些特殊的功能,比如动态添加方法、动态修改方法实现、方法拦截等。

消息转发机制的具体实现原理如下:

  1. 当一个对象收到一条消息时,首先会检查自己的方法列表中是否有对应的实现。
  2. 如果在方法列表中找不到对应的实现,则会检查自己的父类是否有对应的实现。
  3. 如果在父类中也找不到对应的实现,则会尝试消息转发。
  4. 消息转发分为两种:方法转发和属性转发。
  5. 方法转发是将消息转发到另一个对象上,而属性转发是将消息转发到另一个对象的属性上。
  6. 方法转发和属性转发都是通过调用 objc_msgSend 函数来实现的。

总结

消息转发机制是 Objective-C 中一种非常强大的机制,它允许我们将消息转发到其他对象或类上。这使得我们可以很方便地实现一些特殊的功能,比如动态添加方法、动态修改方法实现、方法拦截等。

在本文中,我们详细介绍了消息转发机制的具体实现原理,希望对您理解消息转发机制有所帮助。