category 用来做什么?
- 把类的实现分割到不同的文件里
可以减少单个文件的体积
可以把不同的功能组织到不同的category里
可以由多个开发者共同完成一个类
可以按需加载想要的category 等等。
- 声明私有方法
- 模拟多继承
- 把framework的私有方法公开
category和extension 区别
extension 编译期间决议,和一个类的头文件 实现文件一体的,所以必须有源码才能添加它,通常用来隐藏类的私有信息。可以添加实例变量
category 运行时决议,不能添加实例变量。(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的)。
分类可以添加哪些东西?
根据分类的头文件看
typedef struct category_t {
const char *name;
classref_t cls;
struct method_list_t *instanceMethods;
struct method_list_t *classMethods;
struct protocol_list_t *protocols;
struct property_list_t *instanceProperties;
} c
从category的定义也可以看出category的可为(可以添加实例方法,类方法,甚至可以实现协议,添加属性)和不可为(无法添加实例变量)。
注意:添加属性添加的是get set 方法而并没有添加实例变量。
怎么添加实例变量?
通过关联对象技术
同名分类方法谁能生效取决于编译顺序
因为runtime会优先调用后编译的分类的方法,看源码的实现如下图:
分类方法为什么会覆盖原来类的同名方法?
怎么调用之前的方法呢?
class_copyMethodList 方法获取当前类的方法列表,找到这个集合的这个方法即可。