Swift与Objective-C运行机制区别
2017-03-27 15:08
323 查看
Objective-C中始终先执行完init方法,再调用viewDidLoad方法。
Swift中,convenience init 并没有被认定为是真正的初始化方法,只是一个包含了初始化方法的特殊的普通方法。
情景举例:
初始化一个类,先处理数据,再设置其它控件,通常我们在OC里可以这样写:
翻译成swift就成了这样:
原以为它的运行规则跟OC应该是一致的,妥妥没问题。然而并没有~
在我的项目中断点跟踪发现,convenience init(:)中一直执行到调用handleData之前,就跳到viewDidLoad()中去执行了,直到执行完 setupUI()再转回去执行 handleData( :)
因此做出大胆假设,convenience init(_:)只是一个便利初始化对象的方法,它并不完全等同于OC中的init。此处应该修改为:
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() }
相关文章推荐
- Objective-C 运行时机制详解(区别于C Langauge、C++ Langauge)
- 一、java的版本区别、下载、配置、运行机制
- PHP和Python/Ruby的运行机制有一个本质区别
- Objective-C、C++和swift 的运行效率比较
- 动态的Objective-C——关于消息机制与运行时的探讨
- PHP和Python/Ruby运行机制的本质区别
- python的运行机制和版本区别
- Swift学习之和Objective-C的联系与区别
- Swift/Objc的Runtime(运行时)机制
- 在iOS app中运行Python文件(Swift+Objective C+Python)
- Objective-C的运行时机制,反射机制
- objective-c运行时机制runtime,动态获取对象的属性和成员变量
- 利用Objective-C的反射机制和运行时特性实现类静态方法的动态访问(二)
- Swift 懒加载(lazy) 和 Objective-C 懒加载的区别
- JavaWeb过滤器的运行机制理解及过滤器.监听器.拦截器-原理&区别
- Swift和Objective-C的区别和联系
- Objective-C运行时消息派发机制
- 对比分析Objective_C和Swift懒加载的区别
- python学习笔记-基础篇-day03 python历史、32bit和64bit系统的区别,系统运行机制浅析