iOS中類的成員變量、屬性

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變量

相關文章
相關標籤/搜索