Emmmmm... Objective-C Class Properties 早在 WWDC 2016 中就已經公示,給 Objective-C 加入這個特性主要是爲了與 Swift 類型屬性相互操做。html
官方是這麼說明的:編程
Interoperate with Swift type properties.微信
嘛~ 雖然是爲了配合 Swift 加入的新特性,不過聊勝於無哈!架構
Note: 值得一提的是 Objective-C Class Properties 語法特性雖然是 WWDC 2016 加入的,不過因爲是 Xcode 8 中 LLVM Compiler 的特性,所以也適用於 iOS 10 以前的部署版本喲~app
LLVM 官網 對於 LLVM 的定義:編程語言
Note: The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.ide
Emmmmm... 有趣的是,有的文章把 LLVM 強行展開爲 "low level virtual machine" 譯爲 「低級別虛擬機」,不過在 LLVM 官網 能夠看到官方明示 LLVM 與傳統的虛擬機沒有一毛錢關係,名稱 "LLVM" 自己不是縮寫,它僅僅是項目的名稱而已~模塊化
嘛~ 可能有的同窗不能理解爲什麼 LLVM 是一個編譯器工具鏈集合?這就要從 Apple 的編譯器歷史講起咯~工具
好久好久之前... 算了,我感受要跑題了(囧),這裏簡單列一下 Apple 採用過的編譯方案吧:學習
GCC, the GNU Compiler Collection 是一套由 GNU 開發的編程語言編譯器,最初做爲 GNU 操做系統 的編譯器使用,後面發展成爲類 Unix 操做系統以及 Apple Mac OS X 操做系統的標準編譯器。
本來 GCC 僅能處理 C 語言的編譯,不過 GCC 很快擴展以支持 C++,以後的 GCC 愈加全面,支持 Objective-C,Fortran,Ada,以及 Go 語言。
值得一提的是 GCC 是一套以 GPL 以及 LGPL 許可證鎖發行的 100% 自由軟件,這意味着用戶能夠自由地運行,拷貝,分發,學習,修改並改進該軟件。
LLVM 咱們前面介紹過了,是模塊化 & 可重用性編譯器以及工具鏈技術集合。
LLVM 可以進行程序語言的 編譯期優化、連接優化、在線編譯優化、代碼生成。
前面介紹過 GCC 支持不少語言,系統架構龐大而笨重,而 Apple 大量使用的 Objective-C 在 GCC 中順位(優先級)較低。此外,GCC 做爲一個純粹的編譯系統,在與 IDE 配合方面的表現也不好。
So,Apple 決定從零開始寫 C,C++,Objective-C 的編譯器 Clang。
至此,Apple 完全與 GCC 了斷。
Objective-C Class Properties 做爲 Objective-C 新語法特性在 WWDC2016 What's New in LLVM 中公示,表示 Xcode 8 以後可使用這一新語法特性。
使用方式很簡單:
class
flag@dynamic
to defer to runtimeclass
flag@interface MyType : NSObject
@property (class) NSString *someString;
@end
複製代碼
NSLog(@"format string: %@", MyType.someString);
複製代碼
@implementation MyType
static NSString *_someString = nil;
+ (NSString *)someString { return _someString; }
+ (void)setSomeString:(NSString *)newString { _someString = newString; }
@end
複製代碼
@dynamic
to defer to runtime@implementation MyType
@dynamic (class) someString;
+ (BOOL)resolveClassMethod:(SEL) name {
...
}
@end
複製代碼
筆者在作項目組件下沉時,遇到一個問題,正好適用於 Objective-C Class Properties 發揮:將要下沉的組件庫中某系統類 Categroy 引用了業務層某方法。
業務層應該依賴於將要下沉的組件,而組件既然要下沉就不該該再反過來依賴上層業務實現!
按照常規思路,想要把上層業務中被依賴的部分一塊兒隨組件下沉,可是發現被依賴的部分雖然也屬於一個較爲基礎的模塊,不過此模塊現階段不作下沉...
後來通過組內大佬指點,使用 Objective-C Class Properties 解決了這個問題,即將上層業務被依賴的部分化做將要下沉組件依賴方系統類 Categroy 的 Class Properties。
Note: 在 Categroy 中寫 Objective-C Class Properties 須要使用 Runtime 關聯方法。
文章寫得比較用心(是我我的的原創文章,轉載請註明 lision.me/),若是發現錯誤會優先在個人 我的博客 中更新。若是有任何問題歡迎在個人微博 @Lision 聯繫我~
但願個人文章能夠爲你帶來價值~
補充~ 我建了一個技術交流微信羣,想在裏面認識更多的朋友!若是各位同窗對文章有什麼疑問或者工做之中遇到一些小問題均可以在羣裏找到我或者其餘羣友交流討論,期待你的加入喲~
Emmmmm..因爲微信羣人數過百致使不能夠掃碼入羣,因此請掃描上面的二維碼關注公衆號進羣。