OC屬性與實體變數
無論是java還是c++這些面向物件的語言都會有屬性這一概念,通常而言,對于java屬性和實體變數沒有什么區別,java官方定義的屬性如下:
屬性是指get或者set方法名 去掉get或者set后,把剩余的部分首字母改為小寫后,即為這個類的屬性
其實objective-C與之類似,但是在一般的開發中,oc類的實體變數都不會被直接讀寫,而是通過getter和setter方法來進行讀寫操作,原因如下:
-
直接讀寫實體變數實質上是在編譯的程序中,對.h檔案中宣告的各個實體變數的偏移量進行操作,眾所周知,OC屬于運行時的動態語言,如果在運行時再添加實體變數,則原來的實際偏移量就會出現錯誤,記憶體布局的改變會導致直接讀寫實體變數出現錯誤,
但是如果將實體變數的讀寫修改為通過getter和setter方式的通知(OC的方法可看作為訊息傳遞),而這些物件方法則存于類物件中,這樣就可以解決上述問題,
OC將實體變數當作一種存盤偏移量所用的“特殊變數”,并將其交給類物件來進行保管,這樣做的好處就是系統會在運行期進行查找,若類的定義在運行期改變了,那么存盤的偏移量也就隨之改變,
-
通過setter方法來修改類的實體變數,還可以觸發屬性的KVO,如果是直接改變實體變數,則無法觸發,
屬性的自動合成
使用 @property+型別名+屬性名 可以讓編譯器自動撰寫這些屬性需要的方法,
例如:
@property NSString *autoCreatedStr
在添加了property關鍵字后,編譯器會自動合成以下的setter和getter方法:
- (void) setAutoCreatedStr:(NSString *)autoCreatedStr;
- (NSString *) autoCreatedStr;
在自動合成屬性前,編譯器會自動為屬性提供對應的實體變數,實體變數通常以下劃線開頭+屬性名:
NSString *_autoCreatedStr;
@synthesize關鍵字
在iOS6之前,編譯器是不會在設定完@Property后自動生成實體變數的,當設定完屬性后還要額外再加上一句:
@synthesize autoCreatedStr = _autocreatedStr;
加上這句以后,才能完成添加名為“_autoCreatedStr”的實體變數,
但是在iOS6以后,LLVM編譯器就會為每個屬性添加上對應的@synthesize關鍵字,并且默認實體名為:下劃線開頭+屬性名的格式,
所以在一般的開發中,只有想要自定義實體變數名的時候,才會在.m檔案中手動添加@synthesize來覆寫原來的自動合成的以下劃線開頭的變數名,(一般來說都無需修改默認的實體變數名)
@dynamic關鍵字
dynamic關鍵字主要是用來通知編譯器無需因為@property關鍵字而自動合成屬性(包括生成實體變數和合成getter、setter方法),
在編譯的程序中,編譯器不會因為沒有定義讀寫方法而報錯,因為@dynamic關鍵字默認了讀寫方法會在運行時生成,例如在分類中利用關聯物件來給分類添加屬性等,
總結
- OC開發中,通常不會直接對實體變數操作,而是通過getter和setter方法來對實體變數來進行讀寫,
- ios6后property關鍵字會自動合成實體變數和讀寫方法,
- dynamic關鍵字大部分情況其實用不到,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/2561.html
標籤:iOS
上一篇:IsEqual與Hash個人理解
下一篇:再探NSString
