今天主要記錄下在看書過程中蓄氧,OC類中屬性使用遇到的思考疟位。因為本身就不是很復(fù)雜的內(nèi)容,所以只能算是小到不能再小的分析版扩。
static
首先要說的是static废离。這玩意在JAVA中我常用,不過在oc中總感覺怪怪的礁芦。
一般有兩種用法蜻韭,第一將static變量放到方法的內(nèi)部聲明。
這樣從這個方法第一次被調(diào)用開始宴偿,這個static變量就被創(chuàng)建湘捎。但是方法結(jié)束時并不立即銷毀這個變量诀豁。當這個方法下次被調(diào)用的時候窄刘,這個變量仍然存在,其中的值仍然保留著舷胜。這就是它作為static的意義娩践。不過活翩,雖然這個變量存在,但是由于是在方法體內(nèi)被創(chuàng)建翻伺,我們只能在方法體內(nèi)調(diào)用它材泄。換句話說,在方法生命周期結(jié)束時吨岭,銷毀的是這個變量的引用指針拉宗,而不是這個變量的儲存空間。
第二種使用方法就是在方法的外部去聲明一個static變量辣辫。通常放在implementation文件的開頭旦事。這樣所有方法都可以訪問它了。
需要注意的是急灭,static的內(nèi)容空間是固定的姐浮,動態(tài)創(chuàng)建和銷毀的只是它的引用指針。So葬馋,它的訪問區(qū)域只和創(chuàng)建它的指針的地方有關(guān)卖鲤。由此引申,若父類一個方法A()中定義了一個static的變量v畴嘶,子類繼承了這個方法A()蛋逾,那么子類和父類調(diào)用這個v的值,指向的都是同一個區(qū)域掠廓。訪問這個區(qū)域只和它的指針有關(guān)换怖,所以,只和A()方法的調(diào)用有關(guān)蟀瞧。和誰去調(diào)用無關(guān)沉颂。
@property 和 @synthesize
這兩哥們看似并沒啥特別的,只是編譯器幫助開發(fā)者快速生成類屬性的悦污。
但是在這背后的過程需要清晰铸屉。
@property
@property xxx做的事情是,給類A聲明一個類屬性_xxx(注意有下滑線)切端。且這個變量是A的私有變量彻坛,即外部包括子類都無法直接訪問_xxx。
當然踏枣,@property同時做了另一件事昌屉,創(chuàng)建了名為xxx的get和set方法。So茵瀑,外部和子類可以通過這兩個方法去操控_xxx
@synthesize
這哥們只做了一件事间驮,就是把A中由@property創(chuàng)建的_xxx變量,改名為xxx(去掉了下劃線)马昨。注意竞帽,這里修改的只是變量本身的名字扛施。(只改名,變量仍然為私有變量)
外部和子類訪問時屹篓,雖然調(diào)用的一直是xxx疙渣,但它們用的始終只是set和get方法,而不是直接訪問的這個變量堆巧。
"."運算符
OC中是可以使用點做運算的妄荔。但是和java等語音是不一樣的。OC中的點谍肤,只能算是一種便捷的寫法懦冰,編譯器最終還是轉(zhuǎn)換為了set和get方法來計算。
a.xxx = 1;
//等價于
[a setXXX: 1];
a.xxx;
//等價于
[a xxx];
參考文獻:
《Objective-c 程序設(shè)計》
Joseph的深刻理解谣沸,我這里只是轉(zhuǎn)述