Objective-C做为一门面向对象语言,有类和对象的概念。编译后,类相关的数据结构会保留在目标文件中,在运行时获得解析和使用。在应用程序运行起来的时候,类的信息会有加载和初始化过程。
就像Application有生命周期回调方法同样,在Objective-C的类被加载和初始化的时候,也能够收到方法回调,能够在适当的状况下作一些定制处理。而这正是load和initialize方法能够帮咱们作到的。安全
能够看到这两个方法都是以“+”开头的类方法,返回为空。一般状况下,咱们在开发过程当中可能没必要关注这两个方法。若是有须要定制,咱们能够在自定义的NSObject子类中给出这两个方法的实现,这样在类的加载和初始化过程当中,自定义的方法能够获得调用。
+load数据结构
顾名思义,+load方法在这个文件被程序装载时调用。只要是在Compile Sources中出现的文件老是会被装载,这与这个类是否被用到无关,所以+load方法老是在main函数以前调用。
调用方式:
会循环调用全部类的 +load 方法。注意,这里是(调用分类的 +load 方法也是如此)直接使用函数内存地址的方式 (*load_method)(cls, SEL_load); 对 +load 方法进行调用的,而不是使用发送消息 objc_msgSend 的方式。
这样的调用方式就使得 +load 方法拥有了一个很是有趣的特性,那就是子类、父类和分类中的 +load 方法的实现是被区别对待的。也就是说若是子类没有实现 +load 方法,那么当它被加载时 runtime 是不会去调用父类的 +load 方法的。同理,当一个类和它的分类都实现了 +load 方法时,两个方法都会被调用。
要点:函数
补充上面一点,对于有依赖关系的两个库中,被依赖的类的+load会优先调用。但在一个库以内,父、子类、类别之间调用有顺序,不一样类之间调用顺序是不肯定的。spa
+initialize线程
+initialize 方法是在类或它的子类收到第一条消息以前被调用的,这里所指的消息包括实例方法和类方法的调用,而且只会调用一次。initialize方法其实是一种惰性调用,也就是说若是一个类一直没被用到,那它的initialize方法也不会被调用,这一点有利于节约资源。
调用方式:
runtime 使用了发送消息 objc_msgSend 的方式对 +initialize 方法进行调用。也就是说 +initialize 方法的调用与普通方法的调用是同样的,走的都是发送消息的流程。换言之,若是子类没有实现 +initialize 方法,那么继承自父类的实现会被调用;若是一个类的分类实现了 +initialize 方法,那么就会对这个类中的实现形成覆盖。
要点:对象
类别(Category)继承
对于+initialize,只有最后一个类别执行,本类的+initialize和前面类别的+initialize被隐藏。
而对于+load,本类和本类的全部类别都执行,而且若是Apple的文档中介绍顺序同样:先执行类自身的实现,再执行类别中的实现。
扩展生命周期
由于两个方法只会被系统调用一次(除主动调用外),而且是线程安全的,能够用来做为单例的实现。(能够用+initialize,+load有些隐患,看这里)
�注意ip
问题内存
问题:
解答:
总结