1.OC有一個很好的特征是動態(tài)性。
可以利用OC的動態(tài)性能夠獲得一個類的方法和屬性。
從而實現(xiàn)靈活的程序,但是純swift的類和繼承OC的Swift是否有runtime機制?
純Swift類的函數(shù)調用已經(jīng)不是OC那樣的運行時消息。而是類似C++的vtable,在編譯的時候,就決定調用哪個函數(shù)了。不像OC在運行時才確定調用哪個函數(shù)。
對于純的Swift類來說,無法通過objc runtime替換方法,拿不到這些方法和屬性。
對于繼承自NSObject類(比如NSObject)的Swift來說,將會自動被編譯器插入@objc標志。@objc標志是用來將Swift的API到處給Objective-C和Objective-C runtime使用的。查看下面:
加了@objc標識的方法、屬性無法保證都會被運行時調用,因為Swift會做靜態(tài)優(yōu)化。要想完全被動態(tài)調用,必須使用dynamic修飾。使用dynamic修飾將會隱式的加上@objc標識。