load initialize用法_重写compareto方法

load initialize用法_重写compareto方法initialize方法与load方法比较

大家好,又见面了,我是你们的朋友全栈君。

load方法和initialize方法类似点

    1. 都只会调用一次
    2. 父类在子类之前加载
复制代码

不同点在于:

    1. 加载时间不同,load方法在main()函数前进行调用,initialize在第一次调用类的所属方法时在调用<可能永远不调用>。
    2. load方法不会被Category覆盖。
复制代码

initialize源码

//向对象发送消息时,lookUpImpOrForward函数判断对象是否初始化,没有初始化则先初始化在调用类的方法
IMP lookUpImpOrForward(Class cls, SEL sel, id inst, bool initialize, bool cache, bo ol resolver);
//第一次调用类
if (initialize && !cls->isInitialized()) {
      _class_initialize (_class_getNonMetaClass(cls, inst));
  }
  
// 第一次调用类的方法,初始化对象
void _class_initialize(Class cls) {
    Class supercls;
    bool reallyInitialize = NO;
    // 递归初始化父类
    supercls = cls->superclass;
    if (supercls && !supercls->isInitialized()) {
          _class_initialize(supercls);
    }
    {
        monitor_locker_t lock(classInitLock);
        if (!cls->isInitialized() && !cls->isInitializing()) {
              cls->setInitializing();
              reallyInitialize = YES;
        }
    }
    if (reallyInitialize) { 
        _setThisThreadIsInitializingClass(cls);
        if (MultithreadedForkChild) { performForkChildInitialize(cls, supercls);
            return;
    }
        @try {
            // 通过objc_msgSend函数调用initialize方法
                callInitialize(cls);
          }
        @catch (...) { 
            @throw;
        }
        @finally {
            // 执行initialize方法后,进行系统的initialize过程
            lockAndFinishInitializing(cls, supercls);
        }
        return;
    }
    else if (cls->isInitializing()) {
        if (_thisThreadIsInitializingClass(cls)) {
            return;
        } else if (!MultithreadedForkChild) {
            waitForInitializeToComplete(cls);
            return; 
        } else {
        _setThisThreadIsInitializingClass(cls);
        performForkChildInitialize(cls, supercls);
        }
    }
}
复制代码

转载于:https://juejin.im/post/5c74f6c2f265da2d993d9237

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106976.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [cocos2dx注意事项014]一个用于cocos2dx对象智能指针模板

    [cocos2dx注意事项014]一个用于cocos2dx对象智能指针模板

    2022年1月11日
    41
  • redis+springboot_全集成厨房

    redis+springboot_全集成厨房一、Redis集成简介Redis是我们Java开发中,使用频次非常高的一个nosql数据库,数据以key-value键值对的形式存储在内存中。redis的常用使用场景,可以做缓存,分布式锁,自增序列等,使用redis的方式和我们使用数据库的方式差不多,首先我们要在自己的本机电脑或者服务器上安装一个redis的服务器,通过我们的java客户端在程序中进行集成,然后通过客户端完成对redis的增删改查操作。redis的Java客户端类型还是很多的,常见的有jedis,redission,lettuce等,

    2022年9月22日
    2
  • git提交代码常用命令

    git提交代码常用命令git 使用常用命令使用 git 提交代码命令执行步骤 命令如下 gitadd 使用此种方式提交的一个弊端就是会提交项目中所有新增或者修改的文件 建议使用 idea 自带的提交方式 选择性的提交文件 gitcommit m 实现了 abc 下载及更新服务 提供返回目录 文件和文件夹 的接口 可下载相应的文件 gitpullgitpu 撤销 1 使用 gitlog 命令查看 commit 的历史 2 gitresethard

    2025年11月1日
    3
  • ctf-web:文件包含漏洞和举例-HCTF2018 WarmUp「建议收藏」

    ctf-web:文件包含漏洞和举例-HCTF2018 WarmUp「建议收藏」我又回来更新了,这次是关于web方面的文件包含漏洞.我会在后面以详细的角度来写清楚这个漏洞的利用方法.当然,以下都是我自己的理解,表述什么的都有些野人化了.所以希望各位大佬手下留情.一.漏洞产生的原因这个漏洞可以追溯到很久.更准确来说,其实是人为产生的.由于我php学的不是很专业,所以我就拿c语言来举例了.php里面使用的是include命令,c语言使用的是#include预处理命令.作用是相似的.我新建了两个文件,内容如图.wzc.h:#include”stdio.h”voidpri.

    2022年6月4日
    39
  • linux 文件夹 775,Linux chmod目录权限命令图文详解

    linux 文件夹 775,Linux chmod目录权限命令图文详解原标题 Linuxchmod 目录权限命令图文详解在 Linux 文件系统模型中 每个文件都有一组 9 个权限位用来控制谁能够读写和执行该文件的内容 普通文件大家都了解 这里说说目录的情况 对于目录来说 执行位的作用是控制能否进入或者通过该目录 而不是控制能否列出它的内容 读取位和执行位的组合的作用才是控制是否列出目录中的内容 写入位和执行位的组合则是允许在目录中创建 删除 和重命名文件 下面用实例来说明

    2025年7月17日
    2
  • httprunner(3)用脚手架快速搭建项目

    httprunner(3)用脚手架快速搭建项目前言如何快速搭建一个httprunner项目呢?我们可以使用脚手架,脚手架就是自动地创建一些目录,形成一个项目的架构,不需要我们再手动的去创建查看创建新项目的命令先来查看一下帮助命令httpr

    2022年7月29日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号