最近在檢視項(xiàng)目中的代碼時(shí)看到有人像這樣使用靜態(tài)局部變量(非原始代碼,舉例說(shuō)明):
- (void)function {
static NSString *str = "hello";
...... // 函數(shù)中只有對(duì)str的讀取使用,無(wú)修改
}
我詢(xún)問(wèn)代碼的開(kāi)發(fā)人員為何需要定義這樣一個(gè)局部靜態(tài)變量,對(duì)方的回答是:此函數(shù)需要比較頻繁調(diào)用,定義局部靜態(tài)變量之后就不需要每次調(diào)用此函數(shù)的時(shí)候都定義和釋放變量,可以提高執(zhí)行效率。
咋聽(tīng)此言,好像是有些道理的。但是仔細(xì)一推敲,這種說(shuō)法是存在問(wèn)題的,主要有以下幾點(diǎn)原因:
- 局部靜態(tài)變量的應(yīng)用場(chǎng)景是函數(shù)每次調(diào)用的時(shí)候可以繼續(xù)使用前一次調(diào)用時(shí)對(duì)此變量的賦值。在這個(gè)函數(shù)中,變量str初始化之后并沒(méi)有再賦值,所以不符合局部靜態(tài)變量的使用場(chǎng)景。
- 靜態(tài)變量存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū),函數(shù)第一次被調(diào)用的時(shí)候就會(huì)初始化,直到程序退出時(shí),其使用的內(nèi)存一直不能釋放。
- 使用靜態(tài)變量的函數(shù)都不可重入,是線程不安全的。
- 再則,函數(shù)內(nèi)部的局部變量定義、初始化到釋放,效率并不會(huì)比使用靜態(tài)變量低多少。
所以,除非必要,不要輕易使用靜態(tài)變量,否則其帶來(lái)的收益可能并不會(huì)如預(yù)期那么好。