2016-10-09 122 views
4

我讀過this one的一些帖子,關於Swift中的子類化NSObject之間的區別,或者只是其本地基地class沒有子類化。但他們都有些舊帖子,我不清楚這個話題。Swift 3:子類NSObject或不?

什麼時候應該子類NSObject?子類化和非子類化之間的實際區別是什麼?什麼是目前在Swift中的建議?

回答

9

Apple's documentation about NSObject狀態下面作一介紹:

NSObject的是根類最Objective-C類層次結構的。通過NSObject,對象繼承了運行時系統的基本接口以及像Objective-C對象那樣的行爲能力。

。這將意味着,你需要子類NSObject的代碼中的介紹,只要該類型的實例需要表現得像一個Objective-C對象(或類本身,在某些罕見的情況下)的類型。

我不知道超顯蘋果提供時子類NSObject的,超越suggesting reducing dynamic dispatch或使用不依賴於子類,但protocolextensions,即代碼重用通常更靜態的呈現代碼重用範式書面指導派遣和value type友好)。我相信可以公平地說,雖然大多數Swift程序員已經從Apple獲得了提示,並且Swift語言特徵作爲標誌,以避免在上述需求不存在的情況下引入基於NSObject的類型。 也就是說,作爲一般規則,只有在實際需要Objective-C動態時才引入基於NSObject的類型,最常見的情況是需要與Cocoa API進行交互(特別是在代碼與UI相關時常見:例如視圖控制器,視圖) 。

As pointed out in an answer to the question you link to,與Objective-C風格動態comes the performance of objc_msgSend based method dispatch。雖然Swift類中的方法也是虛擬的,但是當您沒有明確標記@objc屬性的方法時,編譯器能夠使用更快的調度方法 - 特別是當Whole Module Optimization is toggled on時,甚至在Swift 3中更加如此,其中classes are not by default open for subclassing beyond the module that defines the type

除了避免使用NSObject,您還可以在編寫Swift時完全避免基於類的引用類型in many cases。看看上面鏈接的值類型WWDC視頻,或者例如this blog post作爲介紹。簡而言之,使用值類型可以獲得良好的本地推理,通常可以避免動態內存分配和引用計數開銷(儘管不是普遍適用的結構 - 引用類型作爲字段是注意事項)。

1

子類NSObject的一個原因是如果你需要保存一些數據。 NSObject及其所需的全部內容(AFAIK)是您需要寫入文件的NSCoding的最簡單方法。

可以找到一些見解herehere