您的位置:首页 > 移动开发 > Objective-C

Swift与Objective-C运行机制区别

2017-03-27 15:08 323 查看
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()
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: