iOS 分类笔记

category 用来做什么?

  1. 把类的实现分割到不同的文件里
  • 可以减少单个文件的体积

  • 可以把不同的功能组织到不同的category里

  • 可以由多个开发者共同完成一个类

  • 可以按需加载想要的category 等等。

  1. 声明私有方法
  2. 模拟多继承
  3. 把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 方法获取当前类的方法列表,找到这个集合的这个方法即可。

参考链接:

深入理解Objective-C:Category
iOS RunTime之六:Category

你可能感兴趣的:(iOS 分类笔记)