在公司的代碼中, 看到前輩寫了一個判斷對象是否為空值的方法, 瞬間被這個static inline弄得暈頭轉(zhuǎn)向, 由于C和C++沒有學(xué)的很深入, 各種百度乎明白了這個關(guān)鍵字的作用, 代碼如下:
static inline BOOL IsEmpty(id thing) {
return thing == nil || [thing isEqual:[NSNull null]]
|| ([thing respondsToSelector:@selector(length)]
&& [(NSData *)thing length] == 0)
|| ([thing respondsToSelector:@selector(count)]
&& [(NSArray *)thing count] == 0);
}
-
首先重溫一下static的作用:
- static是
靜態(tài)修飾符
, 由他修飾的變量會保存在全局數(shù)據(jù)區(qū) - 普通的局部變量或者全局變量, 都是有系統(tǒng)自動分配內(nèi)存的, 并且當(dāng)變量離開作用域的時候釋放掉
- 而使用static修飾的變量, 則會在程序運行期都不會釋放, 只有當(dāng)程序結(jié)束的時候才會釋放
- 因此對于那些需要反復(fù)使用的變量, 我們通常使用static來修飾, 避免重復(fù)創(chuàng)建導(dǎo)致不必要的內(nèi)存開銷
- static是
-
static inline
- inline函數(shù), 即內(nèi)聯(lián)函數(shù), 他可以向編譯器申請, 將使用inline修飾的函數(shù)內(nèi)容, 內(nèi)聯(lián)到函數(shù)調(diào)用的位置
- 內(nèi)聯(lián)函數(shù)的作用類似于
#define
, 但是他比#define
有一些優(yōu)點- 相對于函數(shù)直接調(diào)用: inline修飾的函數(shù), 不會再調(diào)用這個函數(shù)的時候, 調(diào)用call方法, 就不會將函數(shù)壓棧, 產(chǎn)生內(nèi)存消耗
- 相對于宏:
- 宏需要預(yù)編譯, 而內(nèi)聯(lián)函數(shù)是一個函數(shù), 不許要預(yù)編譯
- 編譯器調(diào)用內(nèi)聯(lián)函數(shù)的時候, 會檢查函數(shù)的傳參是否正確, 但是宏就不會提醒參數(shù)
- 但是內(nèi)聯(lián)函數(shù)的使用也有限制
- 內(nèi)聯(lián)函數(shù)只能對一些小型的函數(shù)起作用, 如果函數(shù)中消耗的內(nèi)存很大, 比如for循環(huán), 則內(nèi)聯(lián)函數(shù)就會默認失效
- 使用static的原因
- 函數(shù)在運行過程中也會分配內(nèi)存, 但是由于static的存在, 因此就和修飾變量類似, 他只會開辟一塊內(nèi)存空間
-
建議
- 對于一些經(jīng)常用的做判斷的小方法, 可以使用內(nèi)聯(lián)函數(shù), 避免使用
#define
的過于臃腫
- 對于一些經(jīng)常用的做判斷的小方法, 可以使用內(nèi)聯(lián)函數(shù), 避免使用