Open imzyf opened 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() }
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这样写:
Swift 中可以这样写: