load方法和initialize方法的理解

本文详细探讨了Objective-C中的`load`和`initialize`方法,包括它们的个人理解、执行顺序、使用场景。`load`方法在类加载时执行,而`initialize`方法在类首次接收到消息时调用。两者都是线程安全的,常用于方法交换、静态变量初始化等场景。文章通过代码示例清晰地展示了它们的执行顺序和特点。
摘要由CSDN通过智能技术生成

load 和 initialize 两个方法算是两个特殊的类方法了,今天偶然从草稿箱中看到还有本篇未完成的博文,如果说当初了解它们是为了应付面试,那么工作之后,了解它们就变成了“必修课”,相比于网上某些十分官方的说法,个人还是喜欢用大白话来诠释自己对它们的理解,这里就写一下个人对这两个方法的理解,如果有理解不到位的地方,还请指正,3Q

load方法

个人理解

从方法的名字来看,它应该是在一个类进行装载的时候触发,更果断一点的说法就是不管这个类有没有被调用,只要它被装载,那么它就会运行这个方法。
那么它什么时候才会被装载呢?而这个时间点应该就是这个类文件在被第一次编译的时候.
个人理解的编译其实就是由编译器静态的分析语法等是否符合标准的过程并将符合标准的语法翻译成机器语言(这也就是我们当语法不对的时候会出现报错,这个阶段是静态的,如果这里有些值是需要动态确定的,强烈建议请换个地方初始化吧)

示例

如果还是比较抽象,这里就用代码创建几个类来说明一下,以下创建一个叫做Person的类作为基类,在创建一个Student类继承自Person类,同时写一个Student的类别,并分别实现它们的load方法:

//Person.m
+(void)load { NSLog(@"I am Person..Load Function!"); }

//Student.m 继承自Person
+(void)load { NSLog(@"I am Student..Load Function!"); }

//Student+CustomLoad.m
+(void)load { NSLog(@"I am Student..Load Function!"); }

此时我们在main.m文件不做任何的操作,编译通过后运行,打印结果如下:

2016-08-30 14:36:59.037 Load_Initalization_Test[25633:319076] I am Person..Load Function!
2016-08-30 14:36:59.038 Load_Initalization_Test[25633:319076] I am Student..Load Function!
2016-08-30 14:36:59.038 Load_Initalization_Test[25633:319076] I am Student+CustomLoad..Load Function!
Program ended with exit code: 0


尽管我没有调用它们,但是它们load方法执行了,这就应了之前说的话,不管类有没有被调用,只要编译到就会执行load方法。
那么我们怎么知道文件会不会编译呢,其实在创建这个类的时候,Xcode自动已经帮我们把它添加到了Compile Sources里面(这里面的实现文件会在编译器编译阶段进行加载,也就是我们所说的load),具体位置就在Targets->Build Phases->Compile Source里面。

如下图(当然,如果把Student+CustomLoad.m从里面删掉,那么就不会打印Student+CustomLoad..Load Function!这句了;但如果您想把Person.m去掉,那么编译器是不会让你通过,因为Student的load依赖于父类Person)


执行顺序

那么顺序为什么load方法会是Person优先,其次是Student,最后才是Student+CustomLoad呢,load的开发文档中有这么两

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值