zoukankan      html  css  js  c++  java
  • Category的真相

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

    使用场景

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

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

    实现原理

    源代码略

    思想:分类是在运行时决议的。

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

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

    注意:

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

    可以思考下+load()方法的执行顺序为什么是  父类->子类->分类

    提示:

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

    Reference:

    1.Objective-C Category 的实现原理

    2.深入理解Objective-C:Category

    3.Objective-C +load vs +initialize

  • 相关阅读:
    用户管理
    网线制作与分类
    5.虚函数,覆盖,多态,异常处理
    4.类的继承
    3.运算符重载
    7.STL
    6.泛型编程与模板
    C++中>>,<<的重载问题
    2.名字空间和构造函数
    1.C和C++的区别
  • 原文地址:https://www.cnblogs.com/H7N9/p/6583043.html
Copyright © 2011-2022 走看看