swift中的@objc的作用


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

自動清除冗余代碼減小包大小

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

那么為什么 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:


 
 

也會在控制台中輸出警告:


 
 

如果你的項目中並不需要優化包大小或者大部分的 swift 函數都會被 OC 調用到,也可以在 XCode 中改回原來 Swift 3 的邏輯:


 
 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM