- 純Swift類的函數調用已經不再是Objective-c的運行時發消息,而是類似C++的vtable,在編譯時就確定了調用哪個函數,所以沒法通過runtime獲取方法、屬性。
- TestSwiftVC繼承自UIViewController,基類為NSObject,而Swift為了兼容Objective-C,凡是繼承自NSObject的類都會保留其動態性,所以我們能通過runtime拿到他的方法。(表示這個類可以被OC使用)
- 可以知道@objc是用來將Swift的API導出給Objective-C和Objective-C runtime使用的,如果你的類繼承自Objective-c的類(如NSObject)將會自動被編譯器插入@objc標識。
- 純Swift類沒有動態性,但在方法、屬性前添加dynamic修飾可以獲得動態性。
繼承自NSObject的Swift類,其繼承自父類的方法具有動態性,其他自定義方法、屬性需要加dynamic修飾才可以獲得動態性。
若方法的參數、屬性類型為Swift特有、無法映射到Objective-C的類型(如Character、Tuple),則此方法、屬性無法添加dynamic修飾(會編譯錯誤), dynamic破壞swift的靜態化
Swift類在Objective-C中會有模塊前綴 - 所有運行時方法都依賴TypeEncoding,也就是method_getTypeEncoding返回的結果,他指定了方法的參數類型以及在函數調用時參數入棧所要的內存空間,沒有這個標識就無法動態的壓入參數(比如testReturnVoidWithaId: Optional("v24@0:8@16") Optional("v"),表示此方法參數共需24個字節,返回值為void,第一個參數為id,第二個為selector,第三個為id),而Character和Tuple是Swift特有的,無法映射到OC的類型,更無法用OC的typeEncoding表示,也就沒法通過runtime獲取了。
Swift Runtime
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內容
- 轉載原文地址 Swift是蘋果2014年發布的編程開發語言,可與Objective-C共同運行于Mac OS和iO...
- 轉載自:移動開發前線 Swift是蘋果2014年發布的編程開發語言,可與Objective-C共同運行于Mac O...