iOS +initialize和+load

 NSObject类有两种初始化方式load和initialize

 load
 + (void)load;
 1. 对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次。
 2. iOS会在应用程序启动的时候调用load方法,在main函数之前调用。
 3. 执行子类的load方法前,会先执行所有超类的load方法,顺序为父类-子类-分类
 4. 在load方法中使用其他类是不安全的,因为会调用其他类的load方法,而如果方法复杂的话,就无法判断出各个类的载入情况,类只有初始化完成后,类实例才能进行正常使用。
 5. load 方法不遵循继承规则,如果类本身没有实现load方法,那么系统就不会调用,不管父类又没有实现(跟 initialize)
 6. 尽可能的的精简load方法,因为整个应用程序在执行load方法时会阻塞,即,程序会阻塞直到所有的load方法执行完毕,才会继续
 7. load方法中最常用的就是方法交换method swizzling
 
 initialize
 + (void)initialize;
 1. 在首次使用该类之前由运行期系统(非人为的)调用,且仅调用一次
 2. 惰性调用,只有当程序使用相关类时,才会调用
 3.运行期系统会确保initialize方法是在线程安全的环境中执行,即,只有执行initialize的那个线程可以操作类或者类实例。其他线程都要先阻塞,等待initialize执行完。
 4.如果类未实现initialize方法,而其超类实现了,那么就会运行超类的实现代码,且会运行两次
   4.1 initialize遵循继承规则
   4.2 初始化子类的时候会先初始化父类,然后会调用父类的initialize方法,而子类没有覆写initialize方法,因此,会再次调用

你可能感兴趣的:(iOS +initialize和+load)