imzyf / ios-swift-learning-notes

📝 iOS Swift Learning Notes - see Issues
MIT License
0 stars 0 forks source link

Swift vs. Objective-C #76

Open imzyf opened 6 years ago

imzyf commented 6 years ago

http://www.code4app.com/blog-822721-1512.html

谈谈对Objective-C和Swift 动态特性的理解

runtime其实就是Objective-C的动态机制。runtime执行的是编译后的代码,这时它可以动态加载对象、添加方法、修改属性、传递信息等等。具体过程是在Objective-C中对象调用方法时,如[self.tableview reload],发生了两件事。

所以整个流程是编译器翻译 –> 给接收者发送消息 –> 接收者响应消息三个流程。

如[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()
}