標籤:
一、類Class中的屬性property
在ios第一版中:
我們為輸出口同時聲明了屬性和底層執行個體變數,那時,屬性是oc語言的一個新的機制,並且要求你必須聲明與之對應的執行個體變數,例如:
注意:(這個是以前的用法)
@interface MyViewController :UIViewController{ UIButton *myButton;}@property (nonatomic, retain) UIButton *myButton;@end
在現在iOS版本中:
蘋果將預設編譯器從GCC轉換為LLVM(low level virtual machine),從此不再需要為屬性聲明執行個體變數了。如果LLVM發現一個沒有匹配執行個體變數的屬性,它將自動建立一個以底線開頭的執行個體變數。因此,在這個版本中,我們不再為輸出口聲明執行個體變數。
ios5更新之後,蘋果是建議以以下的方式來使用:
@interface MyViewController :UIViewController@property (nonatomic, retain) UIButton *myButton;@end
因為編譯器會自動為你產生以底線開頭的執行個體變數_myButton,不需要自己手動再去寫執行個體變數。而且也不需要在.m檔案中寫@synthesize myButton,也會自動為你產生setter,getter方法。
@synthesize的作用:(1)讓編譯器為你自動產生setter與getter方法。(2)可以指定與屬性對應的執行個體變數,例如@synthesize myButton = xxx;那麼self.myButton其實是操作的執行個體變數xxx,而不是_myButton了。
現在:如果.m檔案中寫了@synthesize myButton,那麼產生的執行個體變數就是myButton;如果沒寫@synthesize myButton,那麼產生的執行個體變數就是_myButton。所以跟以前的用法還是有點細微的區別。
二、執行個體變數與屬性變數使用方法
在MyViewController.m檔案中,編譯器也會自動的產生一個執行個體變數_myButton。那麼在.m檔案中可以直接的使用_myButton執行個體變數,也可以通過屬性self.myButton.都是一樣的。用self.yourButton來訪問yourButton變數是不對的,Xcode會提示你使用->,改成self->yourButton就可以了。因為OC中點的運算式是表示調用yourButton方法,而上面代碼沒有yourButton方法,也可以直接使用yourButton。
三、類別中的屬性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方法。
注意一點,匿名類別(匿名擴充)是可以添加執行個體變數的,非匿名類別是不能添加執行個體變數的,只能添加方法,或者屬性(其實也是方法)。
四、成員變數、執行個體變數、屬性變數的聯絡
@interface MyViewController :UIViewControlle{UIButton *yourButton;int count;id data;}@property (nonatomic, strong) UIButton *myButton;@end
在{ } 中所聲明的變數都為成員變數。 所以yourButton、count、data都是成員變數。既然如此,執行個體變數又是什麼意思呢?
執行個體變數本質上就是成員變數,只是執行個體是針對類而言,執行個體是指類的聲明。{ }中的yourButton就是執行個體變數。id 是OC特有的類,本質上講id等同於(void *)。所以id data屬於執行個體變數。
成員變數用於類內部,無需與外界接觸的變數。因為成員變數不會產生set、get方法,所以外界無法與成員變數接觸。根據成員變數的私人性,為了方便訪問,所以就有了屬性變數。屬性變數的好處就是允許讓其他對象訪問到該變數(因為屬性建立過程中自動產生了set 和get方法)。當然,你可以設定唯讀或者可寫等,設定方法也可自訂。所以,屬性變數是用於與其他對象互動的變數。
綜上所述可知:成員變數是定義在{}號中的變數,如果變數的資料類型是一個類則稱這個變數為執行個體變數。因為執行個體變數是成員變數的一種特殊情況,所以執行個體變數也是類內部使用的,無需與外部接觸的變數,這個也就是所謂的類私人變數。而屬性變數是用於與其他對象互動的變數。
但是,現在大家似乎都不怎麼喜歡用成員變數來定義類的變數,都喜歡用屬性變數來定義類的變數。把需要與外部接觸的變數定義在.h檔案中,只在本類中使用的變數定義在.m檔案中。
【轉截】iOS成員變數、執行個體變數、屬性變數三者的聯絡與區別