資源描述:
《objectcproperty括號(hào)內(nèi)屬性講解》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、一、前言一個(gè)object的屬性允許其他object監(jiān)督和改變他的狀態(tài)。但是在一個(gè)設(shè)計(jì)良好的面向?qū)ο蟪绦蛑?,直接訪問一個(gè)object的內(nèi)部狀態(tài)是不可能的。相反,存取器(gettersetter)方法是一個(gè)抽象相互作用object的底層數(shù)據(jù)。通過訪問器方法與屬性進(jìn)行交互@property指令的目標(biāo)是通過自動(dòng)的創(chuàng)建這些存取器方法使創(chuàng)建和配置屬性變得更加簡(jiǎn)單。它允許你在語(yǔ)義級(jí)別上指定公有屬性的行為。而且它比較關(guān)注你的詳細(xì)實(shí)現(xiàn)。這個(gè)模型調(diào)查各種各樣的屬性,這些屬性可以讓你修改getter和setter行為。其中的一些屬性確定是如何處理內(nèi)存的,所以這個(gè)模型也服務(wù)于在Objec
2、tive-C中對(duì)內(nèi)存管理的實(shí)際的介紹。二、@property指令首先,讓我們看一下當(dāng)我們直接使用@property時(shí)發(fā)生了什么事情,考慮一下下面的程序,一個(gè)Car類和它的實(shí)現(xiàn)。Car.h#import@interfaceCar:NSObject@propertyBOOLrunning;@endCar.m#import"Car.h"@implementationCar@synthesizerunning=_running;//Xcode4.4以上可選@end編譯器會(huì)為running屬性創(chuàng)建一個(gè)getter和sette
3、r方法。默認(rèn)的命名習(xí)慣是用屬性自己作為getter,加上前綴set作為setter方法,并且在前面加下劃線作為實(shí)例變量,就像下面這樣:-(BOOL)running{return_running;}-(void)setRunning:(BOOL)running{_running=running;}當(dāng)用@property直接生成屬性,你可以直接調(diào)用這些方法,就像這些方法就是包含在該類的interface和實(shí)現(xiàn)文件中。你也可以在.m中重寫他們,但是這樣會(huì)使得@synthesize指令強(qiáng)制。然而,你應(yīng)該很少需要傳統(tǒng)的存取器盡管@property屬性供這樣做在抽象的級(jí)別。屬
4、性訪問可以是用類實(shí)例后加.訪問。所以看下面的代碼:Car*honda=[[Caralloc]init];honda.running=YES;NSLog(@"%d",honda.running);當(dāng)執(zhí)行honda.running時(shí),也就是調(diào)用setRunning:方法。當(dāng)給他分配值并且運(yùn)行時(shí),就是調(diào)用getter方法。為了改變這種存取器方式,我們可以在@properry后加括號(hào)指定,下面就是介紹可用的屬性。1、Thegetter=andsetter=Attributes如果我們不喜歡@property默認(rèn)的命名方式,我們可以通過Thegetter=andsetter
5、=Attributes來改變存取器方法名。最常用的就是對(duì)Boolean屬性使用這個(gè)??梢园裧etter把慣例的改成is,例如:@property(getter=isRunning)BOOLrunning;現(xiàn)在生成存儲(chǔ)器叫做isRunning和setRunning.而標(biāo)注公共性質(zhì)還是叫做running。下面是我們應(yīng)該怎么用逗號(hào)使用它。Car*honda=[[Caralloc]init];honda.running=YES;NSLog(@"%d",honda.running);NSLog(@"%d",[hondaisRunning]);這些是唯一的屬性,他們都是boo
6、lean標(biāo)記。2、readonly屬性readonly屬性是一個(gè)很方便的方法讓你的屬性只讀。這樣會(huì)省略setter方法,并且防止作惡通過.調(diào)用,但是getter不受影響。例如,我們修改running的屬性為readonly,注:我們可以制定多個(gè)屬性,然后用“,”分開:#import@interfaceCar:NSObject@property(getter=isRunning,readonly)BOOLrunning;-(void)startEngine;-(void)stopEngine;@end不是讓其他obj
7、ect改變r(jià)unning的屬性,我們將會(huì)設(shè)置兩個(gè)方法去訪問。這兩個(gè)方法的而實(shí)現(xiàn)如下:-(void)startEngine{_running=YES;}-(void)stopEngine{_running=NO;}要記得,@property還為我們生成了一個(gè)實(shí)例變量,這就是我們?yōu)槭裁纯梢栽L問_running在沒有聲明的條件下(我們也可以直接使用self.running因?yàn)檫@個(gè)屬性是只讀的)。讓我們來運(yùn)行下列代碼測(cè)試:Car*honda=[[Caralloc]init];//honda.running=YES;NSLog(@"%d",honda.running);ho
8、nda.r