一、UIView的专属初始化方法 :
(1)纯代码的初始化方法:
- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
(2)Xib/Storyboard的初始化方法:
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
self.xibScrollView.backgroundColor = [UIColor greenColor];
这句代码不应该放在该方法里,因为self.scrollView这个子控件可能现在都还没有完成初始化。
}
return self;
}
从xib/storyboard文件中解析UIView控件时会调用该方法。该方法返回表示通过xib创建的子控件加载完毕,可以使用了。【storyboard文件的前身就是xib文件!】
- (void)awakeFromNib {
[super awakeFromNib];
self.xibScrollView.backgroundColor = [UIColor greenColor];
//此时self.scrollView子控件已经初始化完成了,可以做一些额外操作了。
}
这两个方法都是通过xib/storyboard自定义View时会调用的方法,前者表示从xib文件中解析、初始化成UIView,后者表示初始化完成,它们有先后之分;它们两个之间的关系和loadView与viewDidLoad方法相似。
从效果可以看出,在initWithCoder:中做一些未尽操作是不可靠的,应该在awakeFromNib方法中完成。
Xib文件的解析:界面到代码的转化过程详解:
二、UIViewController的专属的初始化方法 :
(1)从资源包中加载xib文件,初始化控制器
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
(2)控制器是从storyboard文件中解析出来的,走该方法;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
CHJViewController *vc = [[CHJViewController alloc]init];
事实上,当我们这样创建对象控制器时,其View是被这样加载的:(a)先看是否有CHJViewController.xib文件(当然是去mainBundle中查找了),有就加载;
(b)没有的话,在看是否有CHJView.xib文件,有就加载;
(c)如果也没有,那好,就创建一个透明的View去充当控制器的View。
以系统默认的ViewController为例:
Main.storyboard ---> ViewController.xib ---> View.xib --->clearColor's View.
三、万类共有的初始化方法:
- (instancetype)init
无疑,都会有这样一个初始化方法,只要它是一个类!
该方法是一个大家都共有的初始化方法,其实它内部仅仅是返回自己,什么都没做,但如果你要重写,就要先调用【super init】
相关链接: