在iOS中的一些框架中,static inline是經常出現的關鍵字組合.
static自不用多說,表示在當前文件中應用,如 static A
, 在其它文件中也可以出現static A
.不會導致重名的錯誤.
inline.內聯函數.
作用:替代宏.
在框架中出現inline時,如YYKit框架.我們稍加觀察就會發現它出現在.h文件中. such as:
static inline CGFloat CGFloatFromPixel(CGFloat value) {
return value / YYScreenScale();
}
//YYScreenScale()方法說明:
CGFloat YYScreenScale() {
static CGFloat scale;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
scale = [UIScreen mainScreen].scale;
});
return scale;
}
雖然static inline
修飾的是函數(或者方法,swift出來后,我覺著方法==函數,朋友們不用咬文嚼字,鄙視我輩了).但它在這里就是宏的作用,即你可以將CGFloatFromPixel
當作一個宏.
當然inline函數與宏有區別,inline可以:
- 解決函數調用效率的問題:
函數之間調用,是內存地址之間的調用,當函數調用完畢之后還會返回原來函數執行的地址。函數調用有時間開銷,內聯函數就是為了解決這一問題。
-
不用inline修飾的函數, 匯編時會出現 call 指令.調用call指令就是就需要:
- (1)將下一條指令的所在地址入棧
- (2)并將子程序的起始地址送入PC(于是CPU的下一條指令就會轉去執行子程序).
結論
為什么inline
能取代宏?
優點相比于函數:
-
inline
函數避免了普通函數的,在匯編時必須調用call
的缺點:取消了函數的參數壓棧,減少了調用的開銷,提高效率.所以執行速度確比一般函數的執行速度要快.
-
2)集成了宏的優點,使用時直接用代碼替換(像宏一樣);
優點相比于宏:
1)避免了宏的缺點:需要預編譯.因為
inline
內聯函數也是函數,不需要預編譯.2)編譯器在調用一個內聯函數時,會首先檢查它的參數的類型,保證調用正確。然后進行一系列的相關檢查,就像對待任何一個真正的函數一樣。這樣就消除了它的隱患和局限性。
3)可以使用所在類的保護成員及私有成員。
inline
內聯函數的說明
1.內聯函數只是我們向編譯器提供的申請,編譯器不一定采取inline
形式調用函數.
2.內聯函數不能承載大量的代碼.如果內聯函數的函數體過大,編譯器會自動放棄內聯.
3.內聯函數內不允許使用循環語句或開關語句.
4.內聯函數的定義須在調用之前.