【iOS】巧用 LLVM 特性: Objective-C Class Properties 解耦

前言

Emmmmm... Objective-C Class Properties 早在 WWDC 2016 中就已經(jīng)公示,給 Objective-C 加入這個(gè)特性主要是為了與 Swift 類型屬性相互操作。

官方是這么說(shuō)明的:

Interoperate with Swift type properties.

嘛~ 雖然是為了配合 Swift 加入的新特性,不過(guò)聊勝于無(wú)哈!

Note: 值得一提的是 Objective-C Class Properties 語(yǔ)法特性雖然是 WWDC 2016 加入的,不過(guò)由于是 Xcode 8 中 LLVM Compiler 的特性,因此也適用于 iOS 10 之前的部署版本喲~

索引

LLVM

Objective-C Class Properties

解耦

總結(jié)

LLVM

LLVM 官網(wǎng) 對(duì)于 LLVM 的定義:

Note: The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.

Emmmmm... 有趣的是,有的文章把 LLVM 強(qiáng)行展開為 "low level virtual machine" 譯為 “低級(jí)別虛擬機(jī)”,不過(guò)在 LLVM 官網(wǎng) 可以看到官方明示 LLVM 與傳統(tǒng)的虛擬機(jī)沒有一毛錢關(guān)系,名稱 "LLVM" 本身不是縮寫,它僅僅是項(xiàng)目的名稱而已~

嘛~ 可能有的同學(xué)不能理解為何 LLVM 是一個(gè)編譯器工具鏈集合?這就要從 Apple 的編譯器歷史講起咯~

很久很久以前... 算了,我感覺要跑題了(囧),這里簡(jiǎn)單列一下 Apple 采用過(guò)的編譯方案吧:

GCC

LLVM & GCC

LLVM Compiler

GCC

GCC, the GNU Compiler Collection 是一套由 GNU 開發(fā)的編程語(yǔ)言編譯器,最初作為 GNU 操作系統(tǒng) 的編譯器使用,后面發(fā)展成為類 Unix 操作系統(tǒng)以及 Apple Mac OS X 操作系統(tǒng)的標(biāo)準(zhǔn)編譯器。

原本 GCC 僅能處理 C 語(yǔ)言的編譯,不過(guò) GCC 很快擴(kuò)展以支持 C++,之后的 GCC 越發(fā)全面,支持 Objective-C,F(xiàn)ortran,Ada,以及 Go 語(yǔ)言。

值得一提的是 GCC 是一套以 GPL 以及 LGPL 許可證鎖發(fā)行的 100% 自由軟件,這意味著用戶可以自由地運(yùn)行,拷貝,分發(fā),學(xué)習(xí),修改并改進(jìn)該軟件。

LLVM & GCC

LLVM 我們前面介紹過(guò)了,是模塊化 & 可重用性編譯器以及工具鏈技術(shù)集合。

LLVM 能夠進(jìn)行程序語(yǔ)言的 編譯期優(yōu)化、鏈接優(yōu)化、在線編譯優(yōu)化、代碼生成。

LLVM Compiler

前面介紹過(guò) GCC 支持很多語(yǔ)言,系統(tǒng)架構(gòu)龐大而笨重,而 Apple 大量使用的 Objective-C 在 GCC 中順位(優(yōu)先級(jí))較低。此外,GCC 作為一個(gè)純粹的編譯系統(tǒng),在與 IDE 配合方面的表現(xiàn)也很差。

So,Apple 決定從零開始寫 C,C++,Objective-C 的編譯器 Clang。

至此,Apple 徹底與 GCC 了斷。

Objective-C Class Properties

Objective-C Class Properties 作為 Objective-C 新語(yǔ)法特性在 WWDC2016 What's New in LLVM 中公示,表示 Xcode 8 之后可以使用這一新語(yǔ)法特性。

使用方式很簡(jiǎn)單:

Declared with class flag

Accessed with dot syntax

Never synthesized

Use @dynamic to defer to runtime

Declared with class flag

@interface MyType : NSObject

@property (class) NSString *someString;

@end

Accessed with dot syntax

NSLog(@"format string: %@", MyType.someString);

Never synthesized

@implementation MyType

static NSString *_someString = nil;

+ (NSString *)someString { return _someString; }

+ (void)setSomeString:(NSString *)newString { _someString = newString; }

@end

Use @dynamic to defer to runtime

@implementation MyType

@dynamic (class) someString;

+ (BOOL)resolveClassMethod:(SEL) name {

...

}

@end

解耦

筆者在做項(xiàng)目組件下沉?xí)r,遇到一個(gè)問(wèn)題,正好適用于 Objective-C Class Properties 發(fā)揮:將要下沉的組件庫(kù)中某系統(tǒng)類 Categroy 引用了業(yè)務(wù)層某方法。

業(yè)務(wù)層應(yīng)該依賴于將要下沉的組件,而組件既然要下沉就不應(yīng)該再反過(guò)來(lái)依賴上層業(yè)務(wù)實(shí)現(xiàn)!

按照常規(guī)思路,想要把上層業(yè)務(wù)中被依賴的部分一起隨組件下沉,但是發(fā)現(xiàn)被依賴的部分雖然也屬于一個(gè)較為基礎(chǔ)的模塊,不過(guò)此模塊現(xiàn)階段不做下沉...

后來(lái)經(jīng)過(guò)組內(nèi)大佬指點(diǎn),使用 Objective-C Class Properties 解決了這個(gè)問(wèn)題,即將上層業(yè)務(wù)被依賴的部分化作將要下沉組件依賴方系統(tǒng)類 Categroy 的 Class Properties。

Note: 在 Categroy 中寫 Objective-C Class Properties 需要使用 Runtime 關(guān)聯(lián)方法。

總結(jié)

介紹了 LLVM 順便提到了 Apple 的編譯系統(tǒng)發(fā)展簡(jiǎn)史。

使用官方 Demo 簡(jiǎn)單介紹了 Objective-C Class Properties 語(yǔ)法特性的書寫方式。

提供了一種巧妙使用 Objective-C Class Properties 解耦的思路。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容