当我们重写类的时候经常提示要添加代码:
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
这个叫必要初始化器,这种情况一般会出现在继承了遵守NSCoding protocol的类,比如UIView系列的类、UIViewController系列的类。
为什么一定要添加:
这是NSCoding protocol定义的,遵守了NSCoding protoaol的所有类必须继承。只是有的情况会隐式继承,而有的情况下需要显示实现。
什么情况下会调用:
1. 当我们使用storyboard实现界面的时候,程序会调用这个初始化器。
UIViewController( ) 适用于 纯代码 编写的控制器的初始化;
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) : 适用于 Xib 编写的控制器的初始化;
再用xib构建控件时
可以通过这两个方法
系统会先调用 init?(coder aDecoder: NSCoder)方法然后再调用awakeFromNib()。所以用哪个都可以,一般对控件做初始化操作用awakeFromNib(),添加子控件用init?(coder aDecoder: NSCoder)。
override func awakeFromNib() {
super.awakeFromNib()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
2. 在序列化和反序列化的时候
当对象需要保存自身时-encoderWithCoder:方法被调用
当对象需要加载自身时-initWithCoder:方法被调用
3. initWithCode:和其他init方法一样,中对对象执行操作之前,需要使用超类对它们进行初始化。为此,可以采用
两种方式,具体取决于父类,如果父类采用了NSCoding协议,则应该调用[super initWithCoder:decoder];
否则,只需要调用[super init]即可。NSobject不采用NSCoding协议,因此我们可以使用简单的init方法