+(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对象的视图已经消失、被覆盖或是隐藏时调用;
参考:伟哥
网友评论