Load与initialize方法

为了讲清楚饿汉式单例模式实现需要了解一下这两个方法.它们的特别之处,在于iOS会在运行期提前并且自动调用这两个方法,而且很多对于类方法的规则(比如继承,类别(Category))都有不同的处理因为这两个方法是在程序运行一开始就被调用的方法,我们可以利用他们在类被使用前,做一些预处理工作。比如我碰到的就是让类自动将自身类名保存到一个NSDictionary中.Apple的文档就不再这里给出了,可以自己去看看.

Apple的文档很清楚地说明了initialize和load的区别在于:load是只要类所在文件被引用就会被调用(不是包含头文件),而initialize是 在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目(不是包含头文件),就不会有load调用;但即使类文件被引用进来,但是没有使用(没有调用该类的任何方法),那么 initialize也不会被调用。

它们的相同点在于:方法只会被调用一次。

文档也明确阐述了方法调用的顺序:父类(Superclass)的方法优先于子类(Subclass)的方法,类中的方法优先于类别(Category)中的方法。这个验证代码就不在这里给出了,有兴趣可以自己写一下,只给部分验证代码.

就像Apple的文档中说的一下,只要有引用runtime就会自动去调用类的+(void)load方法。不过从输出中,我们还发现SuperClass的+(void)initialize也被调用了,而且是在+(void)load之前被执行。这是因为在SuperClass的+(void)load方法中,我们调用了类的alloc方法(其他任意方法都可以,只要是第一次调用),这就符合文档中对+(void)initialize的说明:在类的第一个方法被调用前调用。同时也说明runtime对+(void)load的调用并视为类的第一个方法。调用顺序load->initialize-->该类任意方法(第一次调用),调用顺序是这样,但是后两者的驱动是反过来的,因为调用了该类第一个方法,才调用initialize方法,load方法的驱动是文件加载,ok知道这些就可以讲"饿汉式"单例模式了.

posted @ 2015-11-11 02:50  LDSmallCat  阅读(185)  评论(0编辑  收藏  举报