写在开头:我最近看到网上很多关于方法缓存这方面的文章或多或少都存在一些错误,或者说阐述的不是那么的完整。我写这篇文章的目的是为了看到这篇文章的各位iOS开发者能够对iOS中的方法缓存策略能有一个正确且全面的了解。下面是正文。
在iOS中,对象方法是存储在类对象的bits里面,类方法是存储在元类对象的bits里面。类对象和元类对象的本质都为objc_class类型的结构体。
objc_class数据结构如下:
大家可以看到,这个objc_classj结构体里面有个cache。这个cache的用途就是,缓存我们调用过的方法。
比如我们通过p对象及LGPerson分别调用了test1和test2方法,那么test1方法就会缓存到LGPerson类对象的cache当中,test2方法就会缓存到LGPerson的元类对象的cache当中。
方法的缓存基于不同架构,缓存策略是不一样的。以下是方法存储的核心代码的部分截图,这里就体现了在不同架构下的不同的缓存策略。