Category的真相

Objective-C 中的 Category 就是对设计模式中装饰模式的一种具体实现。它的主要做用是在不改变原有类的前提下,动态地给这个类添加一些方法。html

使用场景

根据苹果官方文档对 Category 的描述,它的使用场景主要有三个:ios

  1. 给现有的类添加方法;
  2. 将一个类的实现拆分红多个独立的源文件;
  3. 声明私有的方法。

实现原理

源代码略objective-c

思想:分类是在运行时决议的。设计模式

  1. 将 Category 和它的主类(或元类)注册到哈希表中;
  2. 若是主类(或元类)已实现,那么重建它的方法列表。

在这里分了两种状况进行处理:Category 中的实例方法和属性被整合到主类中;而类方法则被整合到元类中。另外,对协议的处理比较特殊,Category 中的协议被同时整合到了主类和元类中。app

 

注意:ui

主类中的方法和 Category 中的方法在 runtime 看来并无区别,它们是被同等对待的,都保存在主类的方法列表中。不过,类的方法列表字段有一点特殊,这里不打算详细描述,设计

能够思考下+load()方法的执行顺序为何是  父类->子类->分类指针

提示:htm

runtime 对 Category 中方法的处理过程并无对 +load 方法进行什么特殊地处理。所以,严格意义上讲 Category 中的 +load 方法跟普通方法同样也会对主类中的 +load 方法形成覆盖,只不过 runtime 在自动调用主类和 Category 中的 +load 方法时是直接使用各自方法的指针进行调用的。因此才会使咱们以为主类和 Category 中的 +load 方法好像互不影响同样。所以,当咱们手动给主类发送 +load 消息时,调用的一直会是分类中的 +load 方法,blog

 

Reference:

1.Objective-C Category 的实现原理

2.深刻理解Objective-C:Category

3.Objective-C +load vs +initialize

相关文章
相关标签/搜索