返回
objc_msgSend 消息转发流程探究三
IOS
2023-10-21 08:40:57
消息转发流程
在前面《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 中一种非常强大的机制,它允许我们将消息转发到其他对象或类上。这使得我们可以很方便地实现一些特殊的功能,比如动态添加方法、动态修改方法实现、方法拦截等。
消息转发机制的具体实现原理如下:
- 当一个对象收到一条消息时,首先会检查自己的方法列表中是否有对应的实现。
- 如果在方法列表中找不到对应的实现,则会检查自己的父类是否有对应的实现。
- 如果在父类中也找不到对应的实现,则会尝试消息转发。
- 消息转发分为两种:方法转发和属性转发。
- 方法转发是将消息转发到另一个对象上,而属性转发是将消息转发到另一个对象的属性上。
- 方法转发和属性转发都是通过调用
objc_msgSend
函数来实现的。
总结
消息转发机制是 Objective-C 中一种非常强大的机制,它允许我们将消息转发到其他对象或类上。这使得我们可以很方便地实现一些特殊的功能,比如动态添加方法、动态修改方法实现、方法拦截等。
在本文中,我们详细介绍了消息转发机制的具体实现原理,希望对您理解消息转发机制有所帮助。