Objective-C类初始化:load、initialize和init

+(void)load

*  在main之前,类被加载到系统时调用。

+(void)initialize

*  类首次收到消息时调用,若此类未被使用过,+(void)initialize就不会调用。
*  与+load方法类似的时,在向子类发送initialize消息前,总是会先向父类发送initialize消息,如果父类尚未调用+initialize方法则调用。
*  如果父类中实现了+initialize方法,而子类中没有重写此方法,在子类收到消息的时候,会调用两次initialize,一次是父类调用的,一次是子类调用的。
*  Category中的+initialize方法会覆盖类本身的+initialize方法。

-(instancetype)init

*  类实例化(new)的时候就会调用一次。  [ClassName new]相当于[[class alloc]init]
*  只要new一次,init就会调用一次,new多少次,init就调用多少次,但initialize只会调用一次
*  调用顺序 load、initialize、init

总结

+(void)load和+(void)initialize、-(instancetype)init对比如下:

+(void)load +(void)initialize -(instancetype)init
调用时机 被添加到 runtime 时 收到第一条消息前,可能永远不调用 对象初始化时
调用顺序 父类->子类->分类 父类->子类
调用次数 1次 多次 多次
是否需要显式调用父类实现
是否沿用父类的实现
分类中的实现 类和分类都执行 覆盖类中的方法,只执行分类的实现

另外:

*  视图控制对象通过alloc和init来创建,但是视图控制对象不会在创建的那一刻就马上创建相应的视图,
而是等到需要使用的时候才通过调用loadView来创建,这样的做法能提高内存的使用率.

*  viewDidLoad-加载视图

*  viewWillAppear-UIViewController对象的视图即将加入窗口时调用;

*  viewDidApper-UIViewController对象的视图已经加入到窗口时调用;

*  viewWillDisappear-UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;

*  viewDidDisappear-UIViewController对象的视图已经消失、被覆盖或是隐藏时调用;

参考:伟哥

你可能感兴趣的:(Objective-C类初始化:load、initialize和init)