Load和Initialize的区别和使用

简介: Load和Initialize的区别和使用

1、调用方式


1.1、load是根据函数地址直接调用(编译时调用)。

1.2、initialize是通过objc_msgSend调用(其类或者其子类的第一个方法被执行前调用)。

**共同点:**方法只会被调用一次。


2、调用时机(什么时候会调用)


2.1、load是runtime加载类、分类的时候调用(只会调用一次)。

2.2、initialize是类第一次接收到消息的时候调用,每一个类只会initialize一次(父类的initialize方法可能会被调用多次)。


3. 调用顺序

3.1、load

3.1.1、先调用类的load(先编译的类先调用)

3.1.2、调用子类的load之前,先调用父类的load

3.1.3、再调用分类的load(先编译的分类先调用)


3.2、Initialize

3.2.1、先初始化父类。

3.2.2、再初始化子类(可能最终调用的是父类的Initialize的方法(原因:如果子类没有实现Initialize方法时,会通过superclass调用父类的Initialize的方法)))。

3.2.3、如果在分类中也实现了Initialize方法,则会先调用父类的中的方法,再调用分类中的方法,不会调用本类中的方法,(原因:在运行时(runtime)系统会把分类中的方法插入到原有类的方法数组之前(系统会先创建一个数组将原有类中的方法加入到数组中,在运行时,系统会把分类中的方法插入到数组中(是插入不是添加哦!)))。


总结:


                                                                  +(void)load              +(void)initialize

执行时机                                                在程序运行后立即执行   在类的方法第一次被调时执行

若自身未定义,是否沿用父类的方法? 否 是

类别中的定义 全都执行,但后于类中的方法 覆盖类中的方法,只执行一个

参考:

1、Load方法和Initialize的区别和使用


相关文章
|
6月前
|
机器学习/深度学习 缓存 Python
Cannot find reference ‘TruncatedNormal‘ in ‘__init__.py‘
本文提供了解决在PyCharm中运行论文复现代码时出现的"Cannot find reference 'TruncatedNormal' in '__init__.py'"错误的两种方法:清除缓存和重启,以及在`__init__.py`文件中加入`TruncatedNormal`类。
|
Docker 容器
求助: 运行模型时报错module 'megatron_util.mpu' has no attribute 'get_model_parallel_rank'
运行ZhipuAI/Multilingual-GLM-Summarization-zh的官方代码范例时,报错AttributeError: MGLMTextSummarizationPipeline: module 'megatron_util.mpu' has no attribute 'get_model_parallel_rank' 环境是基于ModelScope官方docker镜像,尝试了各个版本结果都是一样的。
452 5
加载模型出现-RuntimeError: Error(s) in loading state_dict for Net:unexpected key(s) in state_dict: XXX
加载模型出现-RuntimeError: Error(s) in loading state_dict for Net:unexpected key(s) in state_dict: XXX
603 0
|
安全 Python
YAML+PyYAML笔记 8 | PyYAML源码之full_load(),full_load_all(),safe_load(),unsafe_load(),unsafe_load_all()
YAML+PyYAML笔记 8 | PyYAML源码之full_load(),full_load_all(),safe_load(),unsafe_load(),unsafe_load_all()
158 1
/etc/init.d/functions运用实战配置system服务详解
/etc/init.d/functions运用实战配置system服务详解
|
9月前
|
JavaScript 数据安全/隐私保护
v-model和.sync的区别
v-model和.sync的区别
201 0
报错AttributeError: Can‘t pickle local object ‘Worker.__init__.<locals>.<lambda>‘解决办法
报错AttributeError: Can‘t pickle local object ‘Worker.__init__.<locals>.<lambda>‘解决办法
640 0
|
C++ Python
python类中初始化形式:def __init__(self)和def __init__(self, 参数1,参数2,,,参数n)区别
python类中初始化形式:def __init__(self)和def __init__(self, 参数1,参数2,,,参数n)区别
190 0
AttributeError: cannot assign module before Module.__init__() call 怎么解决?
这个错误通常是由于在__init__方法之外对模块中的某些成员进行了初始化或赋值操作,导致模块还没有被完全初始化就已经被调用了。为了解决这个问题,你需要将所有的初始化或赋值操作移到__init__方法内部。 例如,如果你有一个自定义模块MyModule,并且想要在其中定义一个类变量my_var,则应该将其放在__init__方法中:
814 0
Could not initialize English chunker/Could not load file from classpath: ‘/en-token.bin‘
Could not initialize English chunker/Could not load file from classpath: ‘/en-token.bin‘
122 0