前言
之前對于 static
, const
, extern
的使用都只是照搬库倘,并不知道其中的含義,正好最近在項目中也運用到了所以做一個記錄论矾。
我們經(jīng)常在注冊 UITableViewCell
時會用到一個 identifier
的關(guān)鍵字教翩,那么我們的.m文件的代碼中經(jīng)常會出現(xiàn)這樣一句代碼:
static NSString * const 變量名字 = @"變量內(nèi)容";
下面我們來介紹下這些關(guān)鍵字的意思:
static
在一個全局變量前,加上這個關(guān)鍵字贪壳,那么該變量就會被定義成為一個靜態(tài)的全局變量饱亿,靜態(tài)的全局變量在聲明它的整個文件都是可見的,文件之外是不可見的寥袭,一般程序把新產(chǎn)生的動態(tài)數(shù)據(jù)存放在堆區(qū)路捧,函數(shù)內(nèi)部的自動變量存放在棧區(qū),自動變量一般會隨著函數(shù)的退出而釋放空間而靜態(tài)變量并不會因為函數(shù)的退出而釋放空間传黄。定義靜態(tài)變量的優(yōu)勢在于它可以節(jié)省內(nèi)存。
extern
這個關(guān)鍵字是為了告訴編譯器“在當(dāng)前編譯的文件中队寇,有一個標(biāo)識符雖然不是本文件定義的膘掰,但是它可能在其他的文件中定義〖亚玻”识埋,我們一般會這樣寫:
//xxxx.h
extern NSString *defaultSomething;
//xxxx.m
NSString *defaultSomething = @"xxxx";
extern與static
這兩個關(guān)鍵字同樣是修飾全局變量的,但是他們有著很大的區(qū)別零渐。
-
static
修飾的全局變量窒舟,將會變?yōu)槿朱o態(tài)變量,其作用域為這個變量所在的文件內(nèi)诵盼。 -
extern
修飾的全局變量惠豺,默認是有外部鏈接的,但它的作用域則是整個工程风宁,并且它的定義可以是在工程內(nèi)的任意一個文件中洁墙。
const
這個關(guān)鍵字可以將一個變量轉(zhuǎn)換成一個常量,相當(dāng)于 Swift
中的var
與 let
修飾符戒财,但是 const
的位置不同它的作用也是不同:
int me;
1.const int *p1 = &me;
2.int* const p2 = &me;
3.int const *p3 = &me
在上面的代碼中1當(dāng)我們試著去修改 *p1
的時候編譯器會告訴我們 *p1
是不能被修改的热监,而我們?nèi)バ薷?p1
的時候可以正常修改。當(dāng)我們試著去修改代碼2中 *p2
的時候是可以正常修改的, 但是修改 p2
的時候發(fā)現(xiàn)我們無法修改饮寞。那么對于代碼3來說情況與代碼1的一樣孝扛,由此我們可以知道 const
修飾的是它右邊的部分列吼。
我們在回過頭來看我們通常寫的 static NSString * const cellIdentifer = @"cell"
這段代碼時就能很好的理解了其中的意思了。