Swift vs. Objective-C
- 谈谈对Objective-C和Swift 动态特性的理解
runtime其实就是Objective-C的动态机制。runtime执行的是编译后的代码,这时它可以动态加载对象、添加方法、修改属性、传递信息等等。具体过程是在Objective-C中对象调用方法时,如 [self.tableview reload],发生了两件事。
编译阶段,编译器(compiler)会把这句话翻译成
objc_msgSend(self.tableview, @selector(reload))
,把消息发送给self.tableview。运行阶段,接收者self.tableview会响应这个消息,期间可能会直接执行、转发消息,也可能会找不到方法崩溃。
所以整个流程是编译器编译—>给接收者发送消息—>接收者响应消息三个流程。
如 [self.tableview reload] 中, self.tableview就是接收者, reload就是消息,所以方法调用的格式在编译器看来是 [receiver message]。
其中接收者如何响应代码,就发生在运行时(runtime)。runtime执行的是编译后的代码,这时它可以动态加载对象、添加方法、修改属性、传递信息等等,runtime的运行机制就是Objective-C的动态特性。
Swift目前被公认为是一门静态语言。它的动态特性都是通过桥接OC来实现。如果要把动态特性写的更Swift一点,可以用protocol来处理,比如OC中reflection这样写:
* if ([someImage respondsToSelector:@selector(shake)]) {
* [someImage performSelector:shake];
* }
Swift中可以这样写:
* if let shakeableImage = someImage as? Shakeable {
* shakeableImage.shake()
* }
上一题 | 目录 | 完结 |
---|