最近打開手機就會被胡歌主演的《獵場》刷屏,這劇我也一直在追,劇中的鄭秋冬,由於傳銷入獄五年,卻在獄中拜得名師孫漂亮(孫紅雷),苦學HR,並學習了心理學,成功收穫兩樣法寶。出獄後由於怕受人歧視,冒名頂替北大博士的名號,後被發現,被列入黑名單。轉戰杭州,從小職務介紹所作起,一點點打怪升級。
碼農的生活可能不會像影視劇般精彩,甚至是枯燥無聊,可是我也不由想起了大學時候泡在圖書館自學ios開發的時光(於是如今喜獲飯碗),那時不少的基礎知識也都瞭然於胸,眨眼間,兩年工做,在項目中覺得追求實際的應用,卻慢慢淡忘了許多基礎的知識,遂上網複習一下基礎知識,下面轉載一篇不錯的文章,做爲記錄,方便之後的工做和學習。
成員變量用於類內部,無需與外界接觸的變量。由於成員變量不會生成set、get方法,因此外界沒法與成員變量接觸。根據成員變量的私有性,爲了方便訪問,因此就有了屬性變量。屬性變量的好處就是容許讓其餘對象訪問到該變量(由於屬性建立過程當中自動產生了set 和get方法)。固然,你能夠設置只讀或者可寫等,設置方法也可自定義。因此,屬性變量是用於與其餘對象交互的變量。
綜上所述可知:
成員變量是定義在{}號中的變量,若是變量的數據類型是一個類則稱這個變量爲實例變量。由於實例變量是成員變量的一種特殊狀況,因此實例變量也是類內部使用的,無需與外部接觸的變量,這個也就是所謂的類私有變量。而屬性變量是用於與其餘對象交互的變量。
1、類Class中的屬性property
在ios初版中,咱們爲輸出口同時聲明瞭屬性和底層實例變量,那時,屬性是oc語言的一個新的機制,而且要求你必須聲明與之對應的實例變量,例如:
@interface MyViewController :UIViewController
{
UIButton *myButton;
}
@property (nonatomic, retain) UIButton *myButton;
@end
最近,蘋果將默認編譯器從GCC轉換爲LLVM(low level virtual machine),今後再也不須要爲屬性聲明實例變量了。若是LLVM發現一個沒有匹配實例變量的屬性,它將自動建立一個如下劃線開頭的實例變量。所以,在這個版本中,咱們再也不爲輸出口聲明實例變量。
例如:MyViewController.h文件
@interface MyViewController :UIViewController
@property (nonatomic, retain) UIButton *myButton;
@end
在MyViewController.m文件中,編譯器也會自動的生成一個實例變量_myButton。那麼在.m文件中能夠直接的使用_myButton實例變量,也能夠經過屬性self.myButton.都是同樣的。
注意這裏的self.myButton實際上是調用的myButton屬性的getter/setter方法。這與C++中點的使用是有區別的,C++中的點能夠直接訪問成員變量(也就是實例變量)。
例如在oc中有以下代碼
.h文件
@interface MyViewController :UIViewController
{
NSString *name;
}
@end
.m文件中,self.name 這樣的表達式是錯誤的。xcode會提示你使用->,改爲self->name就能夠了。由於oc中點表達式是表示調用方法,而上面的代碼中沒有name這個方法。
oc語法關於點表達式的說明:"點表達式(.)看起來與C語言中的結構體訪問以及java語言彙總的對象訪問有點相似,其實這是oc的設計人員有意爲之。若是點表達式出如今等號 = 左邊,該屬性名稱的setter方法將被調用。若是點表達式出如今右邊,該屬性名稱的getter方法將被調用。"
因此在oc中點表達式其實就是調用對象的setter和getter方法的一種快捷方式, 例如:dealie.blah = greeble 徹底等價於 [dealie.blah setBlah:greeble];
之前的用法,聲明屬性跟與之對應的實例變量:
@interface MyViewController :UIViewControlle
{
UIButton *myButton;
}
@property (nonatomic, retain) UIButton *myButton;
@end
這種方法基本上使用最多,如今大部分也是在使用,由於不少開源的代碼都是這種方式。可是ios5更新以後,蘋果是建議以如下的方式來使用:
@interface MyViewController :UIViewController
@property (nonatomic, retain) UIButton *myButton;
@end
由於編譯器會自動爲你生成如下劃線開頭的實例變量_myButton,不須要本身手動再去寫實例變量。並且也不須要在.m文件中寫@synthesize myButton;也會自動爲你生成setter,getter方法。@synthesize的做用就是讓編譯器爲你自動生成setter與getter方法。
@synthesize 還有一個做用,能夠指定與屬性對應的實例變量,例如@synthesize myButton = xxx;那麼self.myButton實際上是操做的實例變量xxx,而不是_myButton了。
在實際的項目中,咱們通常這麼寫.m文件
@synthesize myButton;
這樣寫了以後,那麼編譯器會自動生成myButton的實例變量,以及相應的getter和setter方法。注意:_myButton這個實例變量是不存在的,由於自動生成的實例變量爲myButton而不是_myButton,因此如今@synthesize的做用就至關於指定實例變量;
若是.m文件中寫了@synthesize myButton;那麼生成的實例變量就是myButton;若是沒寫@synthesize myButton;那麼生成的實例變量就是_myButton。因此跟之前的用法仍是有點細微的區別。
2、類別中的屬性property
類與類別中添加的屬性要區分開來,由於類別中只能添加方法,不能添加實例變量。常常會在ios的代碼中看到在類別中添加屬性,這種狀況下,是不會自動生成實例變量的。好比在:UINavigationController.h文件中會對UIViewController類進行擴展
@interface UIViewController (UINavigationControllerItem)
@property(nonatomic,readonly,retain) UINavigationItem *navigationItem;
@property(nonatomic) BOOL hidesBottomBarWhenPushed;
@property(nonatomic,readonly,retain) UINavigationController *navigationController;
@end
這裏添加的屬性,不會自動生成實例變量,這裏添加的屬性實際上是添加的getter與setter方法。
注意一點,匿名類別(匿名擴展)是能夠添加實例變量的,非匿名類別是不能添加實例變量的,只能添加方法,或者屬性(其實也是方法)。