OC中使用inline內(nèi)聯(lián)函數(shù),主要是為了:
- 解決函數(shù)調(diào)用效率的問(wèn)題
- 由于函數(shù)之間的調(diào)用衙吩,會(huì)從一個(gè)內(nèi)存地址調(diào)到另外一個(gè)內(nèi)存地址互妓,當(dāng)函數(shù)調(diào)用完畢之后還會(huì)返回原來(lái)函數(shù)執(zhí)行的地址。函數(shù)調(diào)用會(huì)有一定的時(shí)間開(kāi)銷坤塞,引入內(nèi)聯(lián)函數(shù)就是為了解決這一問(wèn)題冯勉。
使用例子:
static inline NSString * imageURLKeyForState(UIControlState state) {
return [NSString stringWithFormat:@"image_%lu", (unsigned long)state];
}
我們通常會(huì)發(fā)現(xiàn),inline 會(huì)有 static來(lái)修飾摹芙,表示在當(dāng)前文件中應(yīng)用,如 static b, 在其它文件中也可以出現(xiàn)static b.不會(huì)導(dǎo)致重名的錯(cuò)誤.
inline和函數(shù)
1.inline函數(shù)避免了普通函數(shù)的,在匯編時(shí)必須調(diào)用call的缺點(diǎn):取消了函數(shù)的參數(shù)壓棧灼狰,減少了調(diào)用的開(kāi)銷,提高效率.所以執(zhí)行速度確比一般函數(shù)的執(zhí)行速度要快.
- (1)將下一條指令的所在地址(即當(dāng)時(shí)程序計(jì)數(shù)器PC的內(nèi)容)入棧
- (2)并將子程序的起始地址送入PC(于是CPU的下一條指令就會(huì)轉(zhuǎn)去執(zhí)行子程序)。)
2.集成了宏的優(yōu)點(diǎn),使用時(shí)直接用代碼替換(像宏一樣)
inline和宏
1.避免了宏的缺點(diǎn):需要預(yù)編譯.因?yàn)閕nline內(nèi)聯(lián)函數(shù)也是函數(shù),不需要預(yù)編譯浮禾,宏定義有格式要求而使用inline則就行平常寫(xiě)函數(shù)那樣交胚,只要加上inline即可.
2.編譯器在調(diào)用一個(gè)內(nèi)聯(lián)函數(shù)時(shí),會(huì)首先檢查它的參數(shù)的類型盈电,保證調(diào)用正確蝴簇。然后進(jìn)行一系列的相關(guān)檢查,就像對(duì)待任何一個(gè)真正的函數(shù)一樣匆帚。這樣就消除了它的隱患和局限性熬词。
3.可以使用所在類的保護(hù)成員及私有成員。
inline 說(shuō)明
1.內(nèi)聯(lián)函數(shù)只是我們向編譯器提供的申請(qǐng),編譯器不一定采取inline形式調(diào)用函數(shù).
2.內(nèi)聯(lián)函數(shù)不能承載大量的代碼.如果內(nèi)聯(lián)函數(shù)的函數(shù)體過(guò)大,編譯器會(huì)自動(dòng)放棄內(nèi)聯(lián).
3.內(nèi)聯(lián)函數(shù)內(nèi)不允許使用循環(huán)語(yǔ)句或開(kāi)關(guān)語(yǔ)句
4.內(nèi)聯(lián)函數(shù)的定義須在調(diào)用之前卷扮。