1、類Class中的屬性propertyhtml
在ios初版中,咱們爲輸出口同時聲明瞭屬性和底層實例變量,那時,屬性是oc語言的一個新的機制,而且要求你必須聲明與之對應的實例變量,例如:java
@interface MyViewController :UIViewController { UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton;@end
最近,蘋果將默認編譯器從GCC轉換爲LLVM(low level virtual machine),今後再也不須要爲屬性聲明實例變量了。若是LLVM發現一個沒有匹配實例變量的屬性,它將自動建立一個如下劃線開頭的實例變量。所以,在這個版本中,咱們再也不爲輸出口聲明實例變量。ios
例如:MyViewController.h文件xcode
@interface MyViewController :UIViewController @property (nonatomic, retain) UIButton *myButton;@end
在MyViewController.m文件中,編譯器也會自動的生成一個實例變量_myButton。那麼在.m文件中能夠直接的使用_myButton實例變量,也能夠經過屬性self.myButton.都是同樣的。ide
注意這裏的self.myButton實際上是調用的myButton屬性的getter/setter方法。這與C++中點的使用是有區別的,C++中的點能夠直接訪問成員變量(也就是實例變量)。atom
例如在oc中有以下代碼spa
.h文件.net
@interface MyViewController :UIViewController { NSString *name; }@end
.m文件中,self.name 這樣的表達式是錯誤的。xcode會提示你使用->,改爲self->name就能夠了。由於oc中點表達式是表示調用方法,而上面的代碼中沒有name這個方法。設計
oc語法關於點表達式的說明:"點表達式(.)看起來與C語言中的結構體訪問以及java語言彙總的對象訪問有點相似,其實這是oc的設計人員有意爲之。若是點表達式出如今等號 = 左邊,該屬性名稱的setter方法將被調用。若是點表達式出如今右邊,該屬性名稱的getter方法將被調用。"code
因此在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方法。
注意一點,匿名類別(匿名擴展)是能夠添加實例變量的,非匿名類別是不能添加實例變量的,只能添加方法,或者屬性(其實也是方法)。
from:http://www.cnblogs.com/crazypebble/archive/2013/11/23/3439261.html
【轉載自並整理 http://blog.csdn.net/itianyi/article/details/8618128】
成員變量用於類內部,無需與外界接觸的變量。
根據成員變量的私有性,爲了方便訪問,因此就有了屬性變量。屬性變量的好處就是容許讓其餘對象訪問到該變量。固然,你能夠設置只讀或者可寫等,設置方法也可自定義。因此,屬性變量是用於與其餘對象交互的變量。
一些建議:
1.若是隻是單純的private變量,最好聲明在implementation裏.
2.若是是類的public屬性,就用property寫在.h文件裏
3.若是本身內部須要setter和getter來實現一些東西,就在.m文件的類目裏用property來聲明
from:OC中類得局部變量、屬性變量、成員變量分別怎麼使用、之間有什麼區別和聯繫求詳解?
.h中的interface的大括號{}之間的實例變量,.m中能夠直接使用;
.h中的property變量,.m中須要使用self.propertyVariable的方式使用propertyVariable變量