將方法標記爲@objc與動態之間有什麼區別,您會在何時與其他人做比較?Swift 3 - 動態與@objc
下面是蘋果對動態的定義。
dynamic將此修飾符應用於可由Objective-C表示的 的任何成員。當您使用動態修飾符 標記成員聲明時,對該成員的訪問始終是動態使用Objective-C運行時分派的 。對該成員的訪問權限是 ,不受編譯器內聯或虛擬化。
由於使用Objective-C運行時調度 ,因此使用動態修飾符標記的聲明隱含標記爲objc 屬性。
將方法標記爲@objc與動態之間有什麼區別,您會在何時與其他人做比較?Swift 3 - 動態與@objc
下面是蘋果對動態的定義。
dynamic將此修飾符應用於可由Objective-C表示的 的任何成員。當您使用動態修飾符 標記成員聲明時,對該成員的訪問始終是動態使用Objective-C運行時分派的 。對該成員的訪問權限是 ,不受編譯器內聯或虛擬化。
由於使用Objective-C運行時調度 ,因此使用動態修飾符標記的聲明隱含標記爲objc 屬性。
聲明爲@objc
的函數/變量可從Objective-C訪問,但Swift將繼續通過靜態或虛擬調度直接訪問它。 這意味着如果通過Objective-C框架調用函數/變量,就像使用Key-Value Observing或各種Objective-C API修改類時發生的情況一樣,從Swift和Objective-C調用該方法將產生不同的結果。
使用dynamic
告訴Swift始終引用Objective-C動態分派。 這是Key-Value Observing正常工作所必需的。當調用Swift函數時,它引用Objective-C運行時來動態分配調用。
正如那句話所說,dynamic
意味着@objc
。
除非您將類指定爲dynamic
,否則編譯器可以自由優化並內聯其方法。這帶來了巨大的性能優勢,但這意味着您無法在運行時更改這些方法實現。如果您打算在運行時使用Objective C運行時的反射功能來處理這些方法,則需要使用dynamic
。你會得到一個性能損失(你的代碼將運行在Objective C的速度級別,而不是接近類C級別),但是你會獲得額外的活力。
您的問題已回答? – Alexander