1.OC有一个很好的特征是动态性。
可以利用OC的动态性能够获得一个类的方法和属性。
从而实现灵活的程序,但是纯swift的类和继承OC的Swift是否有runtime机制?
纯Swift类的函数调用已经不是OC那样的运行时消息。而是类似C++的vtable,在编译的时候,就决定调用哪个函数了。不像OC在运行时才确定调用哪个函数。
对于纯的Swift类来说,无法通过objc runtime替换方法,拿不到这些方法和属性。
对于继承自NSObject类(比如NSObject)的Swift来说,将会自动被编译器插入@objc标志。@objc标志是用来将Swift的API到处给Objective-C和Objective-C runtime使用的。查看下面:
加了@objc标识的方法、属性无法保证都会被运行时调用,因为Swift会做静态优化。要想完全被动态调用,必须使用dynamic修饰。使用dynamic修饰将会隐式的加上@objc标识。