前言
上一篇主要復(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)并注明出處。