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標識。