扫码阅读
手机扫码阅读

Category底层原理实现

199 2024-07-09

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

查看原文:Category底层原理实现
文章来源:
程序员华仔
扫码关注公众号
Category底层实现原理摘要

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中定义的方法。

想要了解更多内容?

查看原文:Category底层原理实现
文章来源:
程序员华仔
扫码关注公众号