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的开发文档中有这么两