iOS load 和 initialize
2019-06-14 本文已影响0人
7890陈
load 和 initialize 是 NSObject 的两个类方法,下面介绍这两个方法
// load 方法,官方文档中的描述
Invoked whenever a class or category is added to the Objective-C runtime;
// 每当向Objective-C runtime 中添加类或类别时调用
implement this method to perform class-specific behavior upon loading.
// 实现此方法用于加载执行特定的类行为
// initialize 方法,官方文档中的描述
Initializes the class before it receives its first message.
// 在类收到第一条消息之前初始化它
相同点:
1、在开发者不主动使用的情况下,系统会自动调用一次
2、都是为了APP运行提前创建合适的运行环境
load:
1、执行顺序,SuperClass --> SubClass --> Category
Human 的子类 Person 的子类 Man
2019-06-14 14:13:07.115353+0800 Test[6635:1199762] Human load
2019-06-14 14:13:07.115785+0800 Test[6635:1199762] Person load
2019-06-14 14:13:07.115846+0800 Test[6635:1199762] Man load
2019-06-14 14:13:07.115906+0800 Test[6635:1199762] Man category load
2019-06-14 14:13:07.115960+0800 Test[6635:1199762] Person category load
2019-06-14 14:13:07.116011+0800 Test[6635:1199762] Human category load
没有关系的不同类调用顺序不确定,所以不要在此方法中调用另一个类
2、在 main() 函数执行前调用,通常用来进行 Method Swizzle
initialize:
1、运行时以线程安全的方式向类发送initialize()消息。也就是说,initialize()由第一个线程运行以向类发送消息,并且任何其他试图向该类发送消息的线程都将阻塞,直到initialize()完成
2、如果类和分类都实现了 initialize,只会执行分类中的方法。如果子类、子类分类、父类、父类分类都实现了,子类发送消息,会调用子类分类和父类分类的 initialize ,如果子类未实现,还是会调用父类实现的 initialize
3、在 main() 函数之后执行
4、可以安全使用并调用任意类中的任意方法