一、類(lèi)Class中的屬性property
在第一版中,我們?yōu)檩敵隹谕瑫r(shí)聲明了屬性和底層實(shí)例變量,那時(shí),屬性是oc語(yǔ)言的一個(gè)新的機(jī)制,并且要求你必須聲明與之對(duì)應(yīng)的實(shí)例變量,例如:
@interface MyViewController :UIViewController { UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton; @end
最近,蘋(píng)果將默認(rèn)編譯器從GCC轉(zhuǎn)換為L(zhǎng)LVM(low level virtual machine),從此不再需要為屬性聲明實(shí)例變量了。如果LLVM發(fā)現(xiàn)一個(gè)沒(méi)有匹配實(shí)例變量的屬性,它將自動(dòng)創(chuàng)建一個(gè)以下劃線開(kāi)頭的實(shí)例變量。因此,在這個(gè)版本中,我們不再為輸出口聲明實(shí)例變量。
例如:MyViewController.h文件
@interface MyViewController :UIViewController @property (nonatomic, retain) UIButton *myButton; @end
在MyViewController.m文件中,編譯器也會(huì)自動(dòng)的生成一個(gè)實(shí)例變量_myButton。那么在.m文件中可以直接的使用_myButton實(shí)例變量,也可以通過(guò)屬性self.myButton.都是一樣的。
注意這里的self.myButton其實(shí)是調(diào)用的myButton屬性的getter/setter方法。這與C++中點(diǎn)的使用是有區(qū)別的,C++中的點(diǎn)可以直接訪問(wèn)成員變量(也就是實(shí)例變量)。
例如在oc中有如下代碼
.h文件
@interface MyViewController :UIViewController { NSString *name; } @end
.m文件中,self.name 這樣的表達(dá)式是錯(cuò)誤的。xcode會(huì)提示你使用->,改成self->name就可以了。因?yàn)閛c中點(diǎn)表達(dá)式是表示調(diào)用方法,而上面的代碼中沒(méi)有name這個(gè)方法。
oc語(yǔ)法關(guān)于點(diǎn)表達(dá)式的說(shuō)明:"點(diǎn)表達(dá)式(.)看起來(lái)與C語(yǔ)言中的結(jié)構(gòu)體訪問(wèn)以及java語(yǔ)言匯總的對(duì)象訪問(wèn)有點(diǎn)類(lèi)似,其實(shí)這是oc的設(shè)計(jì)人員有意為之。如果點(diǎn)表達(dá)式出現(xiàn)在等號(hào) = 左邊,該屬性名稱(chēng)的setter方法將被調(diào)用。如果點(diǎn)表達(dá)式出現(xiàn)在右邊,該屬性名稱(chēng)的getter方法將被調(diào)用。"
所以在oc中點(diǎn)表達(dá)式其實(shí)就是調(diào)用對(duì)象的setter和getter方法的一種快捷方式, 例如:dealie.blah = greeble 完全等價(jià)于 [dealie.blah setBlah:greeble];
以前的用法,聲明屬性跟與之對(duì)應(yīng)的實(shí)例變量:
@interface MyViewController :UIViewControlle { UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton; @end
這種方法基本上使用最多,現(xiàn)在大部分也是在使用,因?yàn)楹芏嚅_(kāi)源的代碼都是這種方式。但是ios5更新之后,蘋(píng)果是建議以以下的方式來(lái)使用:
@interface MyViewController :UIViewController @property (nonatomic, retain) UIButton *myButton; @end
因?yàn)榫幾g器會(huì)自動(dòng)為你生成以下劃線開(kāi)頭的實(shí)例變量_myButton,不需要自己手動(dòng)再去寫(xiě)實(shí)例變量。而且也不需要在.m文件中寫(xiě)@synthesize myButton;也會(huì)自動(dòng)為你生成setter,getter方法。@synthesize的作用就是讓編譯器為你自動(dòng)生成setter與getter方法。
@synthesize 還有一個(gè)作用,可以指定與屬性對(duì)應(yīng)的實(shí)例變量,例如@synthesize myButton = xxx;那么self.myButton其實(shí)是操作的實(shí)例變量xxx,而不是_myButton了。
在實(shí)際的項(xiàng)目中,我們一般這么寫(xiě).m文件
@synthesize myButton;
這樣寫(xiě)了之后,那么編譯器會(huì)自動(dòng)生成myButton的實(shí)例變量,以及相應(yīng)的getter和setter方法。注意:_myButton這個(gè)實(shí)例變量是不存在的,因?yàn)樽詣?dòng)生成的實(shí)例變量為myButton而不是_myButton,所以現(xiàn)在@synthesize的作用就相當(dāng)于指定實(shí)例變量;
如果.m文件中寫(xiě)了@synthesize myButton;那么生成的實(shí)例變量就是myButton;如果沒(méi)寫(xiě)@synthesize myButton;那么生成的實(shí)例變量就是_myButton。所以跟以前的用法還是有點(diǎn)細(xì)微的區(qū)別。
二、類(lèi)別中的屬性property
類(lèi)與類(lèi)別中添加的屬性要區(qū)分開(kāi)來(lái),因?yàn)轭?lèi)別中只能添加方法,不能添加實(shí)例變量。經(jīng)常會(huì)在ios的代碼中看到在類(lèi)別中添加屬性,這種情況下,是不會(huì)自動(dòng)生成實(shí)例變量的。比如在:UINavigationController.h文件中會(huì)對(duì)UIViewController類(lèi)進(jìn)行擴(kuò)展
@interface UIViewController (UINavigationControllerItem) @property(nonatomic,readonly,retain) UINavigationItem *navigationItem; @property(nonatomic) BOOL hidesBottomBarWhenPushed; @property(nonatomic,readonly,retain) UINavigationController *navigationController; @end
這里添加的屬性,不會(huì)自動(dòng)生成實(shí)例變量,這里添加的屬性其實(shí)是添加的getter與setter方法。
注意一點(diǎn),匿名類(lèi)別(匿名擴(kuò)展)是可以添加實(shí)例變量的,非匿名類(lèi)別是不能添加實(shí)例變量的,只能添加方法,或者屬性(其實(shí)也是方法)。
from:http://www.cnblogs.com/ygm900/p/3660364.html
- 成員變量用于類(lèi)內(nèi)部,無(wú)需與外界接觸的變量。
- 根據(jù)成員變量的私有性,為了方便訪問(wèn),所以就有了屬性變量。屬性變量的好處就是允許讓其他對(duì)象訪問(wèn)到該變量。當(dāng)然,你可以設(shè)置只讀或者可寫(xiě)等,設(shè)置方法也可自定義。所以,屬性變量是用于與其他對(duì)象交互的變量。
一些建議:
1.如果只是單純的private變量,最好聲明在implementation里.
2.如果是類(lèi)的public屬性,就用property寫(xiě)在.h文件里
3.如果自己內(nèi)部需要setter和getter來(lái)實(shí)現(xiàn)一些東西,就在.m文件的類(lèi)目里用property來(lái)聲明
from:[OC中類(lèi)得局部變量、屬性變量、成員變量分別怎么使用、之間有什么區(qū)別和聯(lián)系求詳解?][來(lái)自ID1]
[來(lái)自ID1]:https://www.zhihu.com/question/23347971 "Title"
.h中的interface的大括號(hào){}之間的實(shí)例變量,.m中可以直接使用;
.h中的property變量,.m中需要使用self.propertyVariable的方式使用propertyVariable變量
from: [Objective-C的屬性和成員變量用法及關(guān)系淺析][來(lái)自ID2] (講解了retain count的 變化)
[來(lái)自ID2]:http://blog.csdn.net/kbawyg/article/details/8038393 "Title"