學(xué)習(xí)ios之路:objective-c--靜態(tài)變量秋秤,外部全局變量,常量總結(jié)

前言

上一篇主要復(fù)習(xí)了實(shí)例變量,這篇文章還依然按自己掌握的java的知識(shí)體系來進(jìn)行oc的復(fù)習(xí)灼卢,本篇主要復(fù)習(xí)oc中的

靜態(tài)變量(內(nèi)部全局變量)

外部全局變量

常量

不管是在java中還是在c++中绍哎,除了有實(shí)例變量外,還會(huì)有類變量芥玉,但是在oc中并沒有類變量一說蛇摸,oc用靜態(tài)變量來達(dá)到類變量的效果。因此我們從靜態(tài)變量開始本篇內(nèi)容的復(fù)習(xí)灿巧。

靜態(tài)變量

靜態(tài)變量也可以被稱為內(nèi)部全局變量,意思就是靜態(tài)變量是在所定義的位置是全局的揽涮,但是不可以被其他文件訪問抠藕。

靜態(tài)變量定義語法

statictypestaticVar;

在定義變量的時(shí)候加關(guān)鍵字static就可以定義靜態(tài)變量。

靜態(tài)變量的使用

不像java中靜態(tài)變量的使用是 類名.靜態(tài)變量蒋困,oc中直接使用定義的靜態(tài)變量即可盾似,不需要加類名,因?yàn)殪o態(tài)變量根本不可能被其他類使用雪标。

靜態(tài)變量的特性:

靜態(tài)變量的作用域是與它定義的位置有關(guān)系

定義在文件中它的作用域就是整個(gè)文件零院,并且是私有的,其他的類或其他的文件是不可以訪問該靜態(tài)變量的

定義在方法內(nèi)村刨,它的作用域就是這方法告抄,其他的方法是不可以訪問該靜態(tài)變量

靜態(tài)變量只初始化一次(和java中是一樣的)

類方法和實(shí)例方法甚至函數(shù)都可以使用靜態(tài)變量

靜態(tài)變量定義在源文件中(.m)

靜態(tài)變量可以定義在方法或函數(shù)體外,也可以定義在方法(類方法和實(shí)例方法)或函數(shù)體內(nèi)嵌牺。

靜態(tài)變量定義在方法或函數(shù)體外

該方式適用于當(dāng)靜態(tài)變量會(huì)被本文件內(nèi)的多個(gè)函數(shù)使用的情況打洼,最好能把靜態(tài)變量定義統(tǒng)一放在源文件的起始處(@implementation的外面),這樣有利于代碼維護(hù)和可讀性,比如:

Vars.m 文件//定義2個(gè)靜態(tài)變量staticintcount;staticinta;@implementationClassName@end

該方式下逆粹,定義的靜態(tài)變量的作用域就是本文件募疮,并且是私有的,只初始化一次僻弹。

靜態(tài)變量定義在方法(類方法和實(shí)例方法)或函數(shù)體內(nèi)

該方式適用于一個(gè)方法或函數(shù)不管調(diào)用多少次阿浓,它們都共享一個(gè)變量的情況√U溃看個(gè)例子:

//實(shí)例方法中定義靜態(tài)變量-(void) counter{//不管counter方法被調(diào)用幾次芭毙,count的值一直在+1staticintcount =0;? ? ? ? count++; }//類方法中定義靜態(tài)變量+(void) print{staticinta =0;? ? ? ? a++;? }

該方式下的定義的靜態(tài)變量作用域就是它所在的方法或函數(shù)內(nèi),并且初始化一次

讓靜態(tài)變量變?yōu)橥獠咳值?/b>

因?yàn)殪o態(tài)變量具有私有的特性蟋字,它只在定義它的源文件內(nèi)可以被訪問稿蹲,若想在其他文件中也可以訪問靜態(tài)變量可以用下面的方法:

定義獲取靜態(tài)變量的類方法

其他類可以使用該類方法來獲取靜態(tài)變量

如下面例子:

@interfaceClassName:NSObject+(int) getCount;//聲明獲取靜態(tài)變量count的類方法@endstaticintcount =0;//定義靜態(tài)變量count,并初始化為0@implementationClassName+(int) getCount{returncount;? ? }@end//使用[ClassName getCount];

小結(jié)

靜態(tài)變量是類似于java中類變量的一種變量

在定義變量前面加static可以定義靜態(tài)變量

靜態(tài)變量的作用域是它定義所處的位置

在源文件中定義靜態(tài)變量

怎么讓靜態(tài)變量變?yōu)橥獠咳值?/p>

外部全局變量

外部全局變量即該變量不僅可以在所定義的文件內(nèi)被訪問鹊奖,也可以在其他文件中被訪問苛聘。凡是定義在函數(shù)或方法之外的變量(除靜態(tài)變量之外)都是外部全局變量。

若一個(gè)變量是外部全局變量,則該變量最好定義在源文件(.m)的起始位置,這樣可以為了更好的維護(hù)设哗。

看個(gè)例子:

Test.m 文件//定義一個(gè)外部全局變量NSString* name;@implementationTest:NSObject-(NSString*) getName{//直接使用returnname;? }@end

該例子定義了一個(gè)類型是NSString名字為name的全局外部變量唱捣,那其他文件怎么使用該變量呢?這時(shí)候就得用到關(guān)鍵字extern,使用語法:

externtypevarName;

上面語法的意思是:即將使用一個(gè)已經(jīng)定義好的外部全局變量网梢,假如在TestVar.m文件中使用Test.m中定義的name震缭,寫法是這樣的:

TestVar.m//整個(gè)文件都可以使用該變量,若只是該文件中的一個(gè)方法使用战虏,//沒必要這樣聲明拣宰,直接在方法里面聲明externNSString*name@implementationTestVar@end

也可以在頭文件中,把全局變量用extern進(jìn)行聲明烦感,這樣就省去在別的文件中使用時(shí)巡社,再次進(jìn)行聲明了,例子:

Test.h? Test頭文件externNSString*name@interfaceTest:NSObject@end

其他文件直接import Test.h文件即可使用name外部全局變量手趣。

常量

oc中的常量和java中的常量類似晌该,在定義的時(shí)候初始化好以后,該常量的值就不可以改變绿渣,定義常量的語法:

consttype constVarName;//定義一個(gè)常量

常量像定義普通變量一樣只不過加了關(guān)鍵字const朝群,常量要定義在源文件中(.m文件)。只要常量是定義在函數(shù)或方法之外中符,那常量也是外部全局變量姜胖,是可以被其他文件使用的,其他文件使用外部全局常量與普通的外部全局變量使用方式一樣舟茶,先用extern關(guān)鍵字進(jìn)行聲明谭期。

變量可否定義在頭文件(.h)中

上面總結(jié)的不管是常量還是外部全局變量定義在源文件中的,那為什么不把它們定義在頭文件中呢吧凉?這是我在學(xué)習(xí)oc時(shí)比較糾結(jié)的問題隧出,當(dāng)我把一個(gè)常量定義在頭文件中時(shí),這時(shí)候報(bào)的"重復(fù)定義的變量"的錯(cuò)誤給了我答案:

因?yàn)橥獠咳肿兞靠隙ū仨毷钦麄€(gè)工程唯一的阀捅,import的作用是把頭文件中的內(nèi)容進(jìn)行拷貝胀瞪,若有多個(gè)文件import了一個(gè)定義了外部全局變量的頭文件,那在整個(gè)工程中就會(huì)出現(xiàn)多個(gè)同名同類型的外部全局變量饲鄙,原來如此啊凄诞,豁然開朗。

但是把靜態(tài)變量定義在頭文件中忍级,多個(gè)文件import這個(gè)頭文件不會(huì)報(bào)“重復(fù)定義變量”的問題帆谍,這是因?yàn)殪o態(tài)變量是內(nèi)部全局,只在一個(gè)文件內(nèi)有效轴咱。但是也不能因?yàn)闆]有錯(cuò)誤就把認(rèn)為可以把靜態(tài)變量定義在頭文件中汛蝙,這種做法是不推薦的烈涮,既然定義了一個(gè)靜態(tài)變量那肯定是要在方法內(nèi)使用它的,只有在源文件中才會(huì)有方法的實(shí)現(xiàn)窖剑,所以靜態(tài)變量也要定義在源文件中

作者:牛曉偉

鏈接:http://www.reibang.com/p/d4f294f681b7

來源:簡書

簡書著作權(quán)歸作者所有坚洽,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末西土,一起剝皮案震驚了整個(gè)濱河市讶舰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌需了,老刑警劉巖跳昼,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肋乍,居然都是意外死亡庐舟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門住拭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人历帚,你說我怎么就攤上這事滔岳。” “怎么了挽牢?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵谱煤,是天一觀的道長。 經(jīng)常有香客問我禽拔,道長刘离,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任睹栖,我火速辦了婚禮硫惕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘野来。我一直安慰自己恼除,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布曼氛。 她就那樣靜靜地躺著豁辉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舀患。 梳的紋絲不亂的頭發(fā)上徽级,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音聊浅,去河邊找鬼餐抢。 笑死现使,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弹澎。 我是一名探鬼主播朴下,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼苦蒿!你這毒婦竟也來了殴胧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤佩迟,失蹤者是張志新(化名)和其女友劉穎团滥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體报强,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灸姊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秉溉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片力惯。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖召嘶,靈堂內(nèi)的尸體忽然破棺而出父晶,到底是詐尸還是另有隱情,我是刑警寧澤弄跌,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布甲喝,位于F島的核電站,受9級特大地震影響铛只,放射性物質(zhì)發(fā)生泄漏埠胖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一淳玩、第九天 我趴在偏房一處隱蔽的房頂上張望直撤。 院中可真熱鬧,春花似錦凯肋、人聲如沸谊惭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圈盔。三九已至,卻和暖如春悄雅,著一層夾襖步出監(jiān)牢的瞬間驱敲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工宽闲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留众眨,地道東北人握牧。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像娩梨,于是被迫代替她去往敵國和親沿腰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容