今天主要記錄下在看書過程中,OC類中屬性使用遇到的思考。因為本身就不是很復雜的內容,所以只能算是小到不能再小的分析。
static
首先要說的是static。這玩意在JAVA中我常用,不過在oc中總感覺怪怪的。
一般有兩種用法,第一將static變量放到方法的內部聲明。
這樣從這個方法第一次被調用開始,這個static變量就被創建。但是方法結束時并不立即銷毀這個變量。當這個方法下次被調用的時候,這個變量仍然存在,其中的值仍然保留著。這就是它作為static的意義。不過,雖然這個變量存在,但是由于是在方法體內被創建,我們只能在方法體內調用它。換句話說,在方法生命周期結束時,銷毀的是這個變量的引用指針,而不是這個變量的儲存空間。
第二種使用方法就是在方法的外部去聲明一個static變量。通常放在implementation文件的開頭。這樣所有方法都可以訪問它了。
需要注意的是,static的內容空間是固定的,動態創建和銷毀的只是它的引用指針。So,它的訪問區域只和創建它的指針的地方有關。由此引申,若父類一個方法A()中定義了一個static的變量v,子類繼承了這個方法A(),那么子類和父類調用這個v的值,指向的都是同一個區域。訪問這個區域只和它的指針有關,所以,只和A()方法的調用有關。和誰去調用無關。
@property 和 @synthesize
這兩哥們看似并沒啥特別的,只是編譯器幫助開發者快速生成類屬性的。
但是在這背后的過程需要清晰。
@property
@property xxx做的事情是,給類A聲明一個類屬性_xxx(注意有下滑線)。且這個變量是A的私有變量,即外部包括子類都無法直接訪問_xxx。
當然,@property同時做了另一件事,創建了名為xxx的get和set方法。So,外部和子類可以通過這兩個方法去操控_xxx
@synthesize
這哥們只做了一件事,就是把A中由@property創建的_xxx變量,改名為xxx(去掉了下劃線)。注意,這里修改的只是變量本身的名字。(只改名,變量仍然為私有變量)
外部和子類訪問時,雖然調用的一直是xxx,但它們用的始終只是set和get方法,而不是直接訪問的這個變量。
"."運算符
OC中是可以使用點做運算的。但是和java等語音是不一樣的。OC中的點,只能算是一種便捷的寫法,編譯器最終還是轉換為了set和get方法來計算。
a.xxx = 1;
//等價于
[a setXXX: 1];
a.xxx;
//等價于
[a xxx];
參考文獻:
《Objective-c 程序設計》
Joseph的深刻理解,我這里只是轉述