Runtime中内部实现.docx
![preview](https://dl-preview.csdnimg.cn/12422943/0001-9889f6b93f04ade6fa35674ad8763682_thumbnail-wide.jpeg)
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
在iOS的运行时系统中,Objective-C的动态性得到了深入的体现,特别是在类的扩展和方法的添加上。本文将详细解析`Runtime`中的内部实现,特别是如何通过分类(Category)来添加实例方法,并深入了解`remethodizeClass`和`attachCategories`这两个关键函数。 首先,分类(Category)是Objective-C中一种强大的特性,允许开发者在不修改原有类源码的情况下,为已有的类添加新的方法、属性或协议。`remethodizeClass`函数是处理类与分类整合的核心,它主要负责将未整合的分类方法添加到类中。 在`remethodizeClass`函数中,首先检查类是否是元类(Meta-Class),然后通过`unattachedCategoriesForClass`获取未整合的分类列表。如果存在这些分类,函数会调用`attachCategories`来处理这些分类,将它们的方法、属性和协议添加到类中。在这个过程中,`PrintConnecting`标志用于在调试模式下输出信息,显示当前正在将哪些分类附加到类上。 接下来,`attachCategories`函数是分类整合的关键步骤。它接受一个`category_list`结构体指针,这个结构体包含了待添加的分类信息。函数首先进行一些内存分配,创建三个二维数组分别用于存储方法列表、属性列表和协议列表。这里使用倒序遍历`cats->list`,以确保最新编译的分类方法优先被添加到类中,这是因为分类中的方法如果有重名,后定义的会覆盖先定义的。 对于每个分类,`attachCategories`函数调用`methodsForMeta`获取分类的方法列表,并将其添加到方法数组中。同样,属性列表和协议列表也通过`propertiesForMeta`和`protocolsForMeta`方法获取,并分别添加到对应的数组中。`fromBundle`标志用于记录分类是否来自动态库,这对于运行时的某些操作至关重要,例如确定方法替换的行为。 当遍历完所有分类后,`attachCategories`会根据数组中的方法、属性和协议信息对类进行更新。这包括了方法的添加、属性的设置以及协议的实现。在更新过程中,如果设置了`flush_caches`标志,那么还会清空方法缓存,以确保新添加的方法能够被正确地查找和调用。 总的来说,`Runtime`中的`remethodizeClass`和`attachCategories`函数负责在运行时将分类的方法、属性和协议集成到类的元数据中,实现了Objective-C的动态扩展特性。这一过程涉及到内存管理、方法查找、属性设置等多个方面,体现了Objective-C运行时系统的强大灵活性和动态性。这种机制使得开发者可以在不修改原类源码的情况下,灵活地对已有类进行扩展和定制,极大地提升了代码的复用性和模块化程度。
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![thumb](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 0
- 资源: 2
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)