Category底层原理实现
![](/theme/default/default/images/main/eye-open.png)
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
![](/theme/default/default/images/main/icon-link.png)
![](/theme/default/default/images/main/icon-jing.png)
1. Category简介
Category是Objective-C 2.0新增的特性,用于为现有的类增加方法、协议和属性。它被广泛应用于类功能的扩展和实现类似多继承的特性。
2. Category源码初探
通过创建一个Person类并为其添加一个分类PersonTest,我们可以使用clang命令将Objective-C代码转换为C++代码,以便深入分析Category的内部结构。分析C++转换结果,发现方法列表、属性和协议分别对应_method_list_t、_prop_list_t和_protocol_list_t结构体。Category的信息被存储在_category_t结构体中,其中包含类方法、对象方法、协议和属性的成员变量。
3. Category底层源码
通过查看Apple开源的objc4库中的objc-runtime-new文件,可以了解到_category_t结构体中包含Category的名称、类指针、对象方法列表、类方法列表、协议列表和属性列表。这表明Category可以添加对象方法、类方法、协议和属性。
面试题解析:Category虽然可以添加属性,但不能添加成员变量,因此不会自动生成setter/getter方法。因为成员变量是在编译时确定的,而Category是在运行时加载的,所以无法将分类的成员变量添加到实例对象中。
4. Category的加载
在Objective-C的runtime运行时,会通过map_images方法调用到objc-runtime-new.mm中的_read_images方法,这个过程中会将Category中的方法、属性和协议添加到对应的类或元类中。Category的方法在加载到类方法列表时会被放在前面,不会替换原有方法,导致在调用时会优先执行Category中定义的方法。
想要了解更多内容?
![](/theme/default/default/images/main/icon-link.png)
![](/theme/default/default/images/main/icon-jing.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)