• Objective


    补充一个加载过程的知识点, 那就是类别的加载过程, 类别的加载过程有一些特殊, 废话不多说, 直接上例子:


    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    + (void)load;
    @end
    
    @implementation Person
    + (void)load
    {
        NSLog(@"Person-----load");
    }
    + (void)initialize
    {
        NSLog(@"Person-initialize");
    }
    @end
    
    @interface Person (XMN)
    + (void)load;
    @end
    
    @implementation Person (XMN)
    + (void)load
    {
        NSLog(@"Person(XMN)-----load");
    }
    + (void)initialize
    {
        NSLog(@"Person(XMN)-initialize");
    }
    @end
    
    int main()
    {
        return 0;
    }

    结果:

    2015-01-24 14:44:37.224 07-类的本质[10784:1172004] Person----load
    2015-01-24 14:44:37.225 07-类的本质[10784:1172004] Person(XMN)-----load
    



    刚刚我们也说了, load方法在程序启动的时候就会把项目中所有的类都加载一遍, 这个就没什么好探讨的, 下面继续:

    int main()
    {
        [[Person alloc]init];
        return 0;
    }

    结果:

    2015-01-24 14:46:41.691 07-类的本质[10792:1173167] Person----load
    2015-01-24 14:46:41.692 07-类的本质[10792:1173167] Person(XMN)-----load
    2015-01-24 14:46:41.692 07-类的本质[10792:1173167] Person(XMN)-initialize

    在这里, 就只会调用类别的initialize方法, 就算Person本来就又inititalize方法, 也会覆盖掉原来的方法, 这一点就比较特殊, 我们需要留意一下





    再重复一次:

    1. 在程序启动时, 就会加载项目中所有的类和类别, 而且加载后会调用每个类和类别的load方法, 并且只会调用一次.

    2. 当第一次调用某个类的时候, 就会调用当前类的initialize方法, 如果该类有类别, 并且有initialize方法, 那么就只会使用类别的initialize方法.

    3. 先加载父类, 后加载子类, (先调用父类的+load方法, 再调用子类的+load方法)

    4. 先初始化父类, 再初始化子类(先调用父类的+initialize方法, 再调用子类的+initialize方法)





    好了, 这次我们就说到这里, 下次我们继续~~

  • 相关阅读:
    iptables防火墙-SNAT和DNAT
    exists & in
    系统演化之路
    promethue 采集traefik指标列表
    Grafana中变量
    Wireshark抓包
    http协议格式 基于ABNF语义定义
    Prometheus 管理常用知识点
    python时间转换
    通过salt-api获取minion的ip地址
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4282833.html
Copyright © 2020-2023  润新知