深入剖析OC底层之objc_msgSend方法查找(下)
2023-11-21 23:37:41
继续探索objc_msgSend方法查找
在上一篇中,我们探讨了objc_msgSend方法查找的初始流程,并介绍了cache_t和resolveInstanceMethod方法。在本篇中,我们将继续深入探讨objc_msgSend方法查找的后续流程,并揭示动态方法决议的奥秘。
cache_t找不到方法怎么办?
当在cache_t中找不到所需的方法时,系统会再给一次机会调用:resolveInstanceMethod:方法。如果实现了这个方法,就能避免闪退。resolveInstanceMethod:方法的作用是动态地为当前对象创建一个新的方法。其声明如下:
- (BOOL)resolveInstanceMethod:(SEL)sel
- sel:要查找的方法选择器。
如果实现了resolveInstanceMethod:方法,则在cache_t中找不到方法时,系统会调用这个方法。如果resolveInstanceMethod:方法能够成功创建所需的方法,则返回YES,表示方法查找成功;否则,返回NO,表示方法查找失败。
resolveInstanceMethod:方法的实现
以下是一个resolveInstanceMethod:方法的示例实现:
- (BOOL)resolveInstanceMethod:(SEL)sel
{
if (sel == @selector(sayHello)) {
// 动态创建一个名为sayHello的方法
IMP imp = imp_implementationWithBlock(^(id self) {
NSLog(@"Hello, world!");
});
class_addMethod([self class], sel, imp, "v@:");
return YES;
}
return NO;
}
在这个示例中,resolveInstanceMethod:方法检查传入的sel是否等于@selector(sayHello)。如果是,则动态创建一个名为sayHello的方法,并将其添加到当前类的类方法表中。最后,返回YES,表示方法查找成功。
动态方法决议的意义
动态方法决议是一种非常强大的机制,它允许我们在运行时动态地添加方法。这在很多场景下都非常有用,比如:
- 动态加载类:我们可以通过动态方法决议来动态加载类,而无需重新编译程序。
- 动态创建对象:我们可以通过动态方法决议来动态创建对象,而无需修改类的定义。
- 动态添加方法:我们可以通过动态方法决议来动态添加方法,而无需修改类的源代码。
总结
objc_msgSend方法查找是一个非常复杂的过程,它涉及到cache_t、动态方法决议等多种机制。通过深入理解这些机制,我们可以更好地理解Objective-C的运行时机制,并编写出更加健壮的代码。
希望本篇OC底层原理系列文章能够对读者有所帮助。如果您有任何问题或建议,欢迎在评论区留言。