Objective-C中始终先执行完init方法,再调用viewDidLoad方法。
Swift中,convenience init 并没有被认定为是真正的初始化方法,只是一个包含了初始化方法的特殊的普通方法。
情景举例:
初始化一个类,先处理数据,再设置其它控件,通常我们在OC里可以这样写:
-(instancetype)initWith:(NSArray*)data{
if(self = [super init]){
//...省略一些简单设置
[self initialData:data];
}
return self;
}
-(void)viewDidLoad {
[super viewDidLoad];
[self setupUI];
}
翻译成swift就成了这样:
convenience init(data:Array<AnyObject>?) {
self.init(nibName: nil, bundle: nil)
//...省略一些简单设置
handleData(with: data)
}
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
原以为它的运行规则跟OC应该是一致的,妥妥没问题。然而并没有~
在我的项目中断点跟踪发现,convenience init(:)中一直执行到调用handleData之前,就跳到viewDidLoad()中去执行了,直到执行完 setupUI()再转回去执行 handleData( :)
因此做出大胆假设,convenience init(_:)只是一个便利初始化对象的方法,它并不完全等同于OC中的init。此处应该修改为:
convenience init(data:Array<AnyObject>?) {
self.init(nibName: nil, bundle: nil)
//...省略一些简单设置
handleData(with: data)
setupUI()
}
override func viewDidLoad() {
super.viewDidLoad()
}