首先看段代碼
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)修飾符, 由他修飾的變量會(huì)保存在全局?jǐn)?shù)據(jù)區(qū)
普通的局部變量或者全局變量, 都是有系統(tǒng)自動(dòng)分配內(nèi)存的, 并且當(dāng)變量離開作用域的時(shí)候釋放掉
而使用static修飾的變量, 則會(huì)在程序運(yùn)行期都不會(huì)釋放, 只有當(dāng)程序結(jié)束的時(shí)候才會(huì)釋放
因此對(duì)于那些需要反復(fù)使用的變量, 我們通常使用static來修飾, 避免重復(fù)創(chuàng)建導(dǎo)致不必要的內(nèi)存開銷
static inline
inline函數(shù), 即內(nèi)聯(lián)函數(shù), 他可以向編譯器申請(qǐng), 將使用inline修飾的函數(shù)內(nèi)容, 內(nèi)聯(lián)到函數(shù)調(diào)用的位置
內(nèi)聯(lián)函數(shù)的作用類似于#define, 但是他比#define有一些優(yōu)點(diǎn)
相對(duì)于函數(shù)直接調(diào)用: inline修飾的函數(shù), 不會(huì)再調(diào)用這個(gè)函數(shù)的時(shí)候, 調(diào)用call方法, 就不會(huì)將函數(shù)壓棧, 產(chǎn)生內(nèi)存消耗
相對(duì)于宏:
宏需要預(yù)編譯, 而內(nèi)聯(lián)函數(shù)是一個(gè)函數(shù), 不需要預(yù)編譯
編譯器調(diào)用內(nèi)聯(lián)函數(shù)的時(shí)候, 會(huì)檢查函數(shù)的傳參是否正確, 但是宏就不會(huì)提醒參數(shù)
但是內(nèi)聯(lián)函數(shù)的使用也有限制
內(nèi)聯(lián)函數(shù)只能對(duì)一些小型的函數(shù)起作用, 如果函數(shù)中消耗的內(nèi)存很大, 比如for循環(huán), 則內(nèi)聯(lián)函數(shù)就會(huì)默認(rèn)失效
使用static的原因
函數(shù)在運(yùn)行過程中也會(huì)分配內(nèi)存, 但是由于static的存在, 因此就和修飾變量類似, 他只會(huì)開辟一塊內(nèi)存空間
建議
對(duì)于一些經(jīng)常用的做判斷的小方法, 可以使用內(nèi)聯(lián)函數(shù), 避免使用#define的過于臃腫