swift中的@objc的做用

轉載:https://www.jianshu.com/p/6c5b45d9d042

自動清除冗餘代碼減少包大小

得益於 Swift 的靜態語言特性,每一個函數的調用在編譯期間就能夠肯定。所以在編譯完成後能夠檢測出沒有被調用到的 swift 函數,優化刪除後能夠減少最後二進制文件的大小。這個功能在 XCode 9 和 Swift 4 中終於被引進。相較於 OC 又多了一個殺手級特性。swift

那麼爲何 OC 作不到這點呢?由於在 OC 中調用函數是在運行時經過發送消息調用的。因此在編譯期並不肯定這個函數是否被調用到。由於這點在混合項目中引起了另一個問題:swift 函數怎麼知道是否被 OC 調用了呢?出於安全起見,只能保留全部可能會被 OC 調用的 swift 函數(標記爲 @objc 的)。安全

在 swift 3 中除了手動添加 @objc 聲明函數支持 OC 調用還有另一種方式:繼承 NSObject。class 繼承了 NSObject 後,編譯器就會默認給這個類中的全部函數都標記爲 @objc ,支持 OC 調用。然而在實際項目中,一個 swift 類雖然繼承了 NSObject,可是其中仍是有不少函數不會在 OC 中被調用,這裏有很大的優化空間。因而根據 SE160 的建議,蘋果修改了自動添加 @objc 的邏輯:一個繼承 NSObject 的 swift 類再也不默認給全部函數添加 @objc。只在實現 OC 接口和重寫 OC 方法時才自動給函數添加 @objc 標識。函數

XCode 9會在運行過程當中自行檢測類中函數是被 OC 調用,而後提示添加 @objc。下圖中的 vc 是 swift 中的類,showStatus 也是 swift 函數,如今編譯器會提示須要手動添加 @objc:優化


 
 

也會在控制檯中輸出警告:spa


 
 

若是你的項目中並不須要優化包大小或者大部分的 swift 函數都會被 OC 調用到,也能夠在 XCode 中改回原來 Swift 3 的邏輯:orm


 
 

這個優化幫助蘋果的 Apple Music 應用減少了5.7%的包大小。blog

相關文章
相關標籤/搜索