iOS底层探索:objc_msgSend慢速查找
2023-12-19 21:44:32
iOS底层探索:objc_msgSend慢速查找
注:本文旨在记录笔者的学习过程,仅代表笔者的个人理解,如果有表述不准确的地方,欢迎各位指正!因为涉及到的概念来源自网络,所以如有侵权,也望告知!
前言
本文主要是为了探索方法调用在iOS底层的实现。今天的内容还是非常硬核的,从函数调用说起,深入分析了苹果的运行时系统,并且我们着重介绍了下函数调用的实际实现,这个函数在iOS开发中几乎无处不在,需要重点关注。
函数调用
在iOS中,函数调用是通过objc_msgSend这个函数来实现的。这个函数有两个参数:第一个参数是要调用的对象,第二个参数是要调用的方法。objc_msgSend函数会根据对象和方法查找要调用的函数,然后执行这个函数。
objc_msgSend函数的查找过程如下:
-
objc_msgSend函数首先会检查对象是否实现了要调用的方法。如果实现了,则直接调用这个方法。
-
如果对象没有实现要调用的方法,则objc_msgSend函数会检查对象的类是否实现了这个方法。如果实现了,则调用这个方法。
-
如果对象的类也没有实现要调用的方法,则objc_msgSend函数会检查对象的超类是否实现了这个方法。如果实现了,则调用这个方法。
-
如果对象的超类也没有实现要调用的方法,则objc_msgSend函数会继续检查对象的超类的超类,以此类推。
-
如果objc_msgSend函数一直找不到要调用的方法,则会抛出一个异常。
objc_msgSend的慢速查找
objc_msgSend函数的查找过程可能是很慢的,尤其是对于大型类层次结构。这是因为objc_msgSend函数需要检查每个类及其超类是否实现了要调用的方法。对于大型类层次结构,这可能需要检查很多个类。
为了解决这个问题,苹果公司引入了“慢速查找”优化。慢速查找优化会缓存每个类及其超类是否实现了给定方法的信息。这使得objc_msgSend函数可以跳过检查已经缓存的类,从而加快查找过程。
慢速查找优化对于大型类层次结构非常有效。它可以显著减少objc_msgSend函数的查找时间。
总结
objc_msgSend函数是iOS中函数调用的基础。这个函数通过查找对象及其超类是否实现了要调用的方法来执行函数。objc_msgSend函数的查找过程可能是很慢的,尤其是对于大型类层次结构。为了解决这个问题,苹果公司引入了“慢速查找”优化。慢速查找优化会缓存每个类及其超类是否实现了给定方法的信息。这使得objc_msgSend函数可以跳过检查已经缓存的类,从而加快查找过程。