一.setter和getter的一般寫(xiě)法
setter
和getter
器可以說(shuō)是一個(gè)類(lèi)最基本的東西,任何一門(mén)面向?qū)ο蟮恼Z(yǔ)言,都又這個(gè)概念偿枕,C++
年局、Java等等哑子。因?yàn)?code>setter和getter
是對(duì)面向?qū)ο笳Z(yǔ)言封裝的最基本的支持漱牵。
在Objective-C
的setter
和getter
器桐罕,當(dāng)然也和一般的語(yǔ)言沒(méi)有什么不同宁否。只不過(guò)缩麸,添加了一些自己的特性铸磅。
比如有一個(gè)實(shí)例變量:int age
;
先在.h
文件中聲明setter
和getter
器
- (void)setAge:(int)newAge;
- (int)age;
然后在.m
文件中具體實(shí)現(xiàn)
- (void)setAge:(int)newAge
{
age=newAge;
}
- (int)age
{
return age;
}
可以看出來(lái),在Objective-C
中setter
器沒(méi)什么區(qū)別杭朱,不過(guò)getter
器的方法名缺少了get
阅仔,因?yàn)?code>get在Objective-C
有別的用處,所以getter
器直接寫(xiě)的就是變量名弧械。
二八酒、getter和setter 的調(diào)用方法
一般的調(diào)用方法,是傳統(tǒng)的帶中括號(hào)[ ]
的調(diào)用方法刃唐,比如
//比如上面的聲明是一個(gè)Person類(lèi)
Person* person=[[Person alloc]init];
[person setAge:13];
int age=[person age];
點(diǎn)調(diào)用的方式
//點(diǎn)調(diào)用
person.age=13; //.調(diào)用出現(xiàn)在=號(hào)左邊羞迷,相當(dāng)于setter
int age=person.age //.調(diào)用出現(xiàn)在=號(hào)的右邊,相當(dāng)于getter
NSLog(@"%i",person.age);//這也是getter
三画饥、setter和getter的改進(jìn)寫(xiě)法
每次要為一個(gè)屬性寫(xiě)上getter
和setter
衔瓮,不得不手十分麻煩,所以有了更簡(jiǎn)單的寫(xiě)法抖甘,
在.h
文件里热鞍,直接這樣寫(xiě),表示聲明了一個(gè)實(shí)例屬性和它的getter
和setter
器
@property int age;
然后在.m
文件中這樣寫(xiě)衔彻,表示實(shí)現(xiàn)setteer
和getter
@synthesize age;
這樣薇宠,就可以和以前一樣調(diào)用getter
和setter
了。
四艰额、setter和getter的改進(jìn)優(yōu)化
可以看到澄港,getter
器的方法名直接就是變量名,方法名和變量名一樣悴晰,容易讓人迷糊慢睡,所以,可以這樣優(yōu)化铡溪。
在.h
文件中依然這樣聲明
@property int age;
在.m
文件中,這樣去寫(xiě)泪喊,
@synthesize age=_age; //加上一個(gè)_
//這么棕硫,我們就可以去使用_age 和使用age一樣
-(void)show
{
NSLog(@"%i",_age);
}
五、@property
的屬性
可以使用屬性來(lái)規(guī)定@property
袒啼,設(shè)定的方式如下:
@property (attribute1[,attrubute2,...])
舉個(gè)例子:
@property (nonatomic,strong) Engine* engine;
如果你在@property
設(shè)置了屬性哈扮,如果你使用@synthesize
纬纪,那么它會(huì)自動(dòng)幫你完成這些屬性的實(shí)現(xiàn),如果你是自己手動(dòng)的去完成實(shí)現(xiàn)的話滑肉,那么包各,你必須自己寫(xiě)出這些屬性的實(shí)現(xiàn)。
(1)靶庙、設(shè)置訪問(wèn)方法的名字
默認(rèn)的getter
和setter
器的名稱(chēng)是和變量名關(guān)聯(lián)的问畅,一定是setVirableName
和virableName
,比如上面的變量age
六荒,setter
是setAge
护姆,getter
是age
。
可以通過(guò)設(shè)置@property
中的setter
和getter
屬性來(lái)修改setter
和getter
器的方法名掏击。
getter=getterName
setter=setterName
舉個(gè)例子:
@property (getter=show1,setter=show2:)int age;//現(xiàn)在卵皂,它的getter和setter的方法名字就變了
注意:如果你設(shè)置了readonly
屬性的話,那么你就不應(yīng)該設(shè)置setter
屬性砚亭,要不然會(huì)給出一個(gè)編譯器的警告灯变。
(2)、設(shè)置只讀或讀寫(xiě)
下面兩個(gè)屬性很好理解捅膘,
readwrite
:表示既有getter
柒凉,也有setter
readonly
:表示只有getter
,沒(méi)有setter
這兩個(gè)屬性是互相排斥的篓跛,只能存在一個(gè)膝捞。
(3)、定義setter
的語(yǔ)義
下面的屬性指定setter
語(yǔ)義設(shè)置訪問(wèn)器愧沟。他們是互相排斥的蔬咬。
strong
:指定有很強(qiáng)的(擁有)關(guān)系到目標(biāo)對(duì)象。
weak
:指定有弱(non-owning)
關(guān)系到目標(biāo)對(duì)象沐寺。如果目的地對(duì)象銷(xiāo)毀,屬性值將自動(dòng)設(shè)置為nil林艘。(弱屬性不支持OS X上的v10.6和iOS4 ,使用指定取而代之)混坞。
copy
:調(diào)用原始對(duì)象的copy()
方法狐援,創(chuàng)建一個(gè)原始對(duì)象的副本,用于分配給新的引用究孕。原始的對(duì)象在調(diào)用release
方法啥酱。當(dāng)然這個(gè)屬性只用于實(shí)現(xiàn)了NSCopying
協(xié)議的對(duì)象類(lèi)型。
assign
:指定使用簡(jiǎn)單的賦值的setter
厨诸。這個(gè)屬性是違約镶殷。 使用這個(gè)屬性對(duì)于標(biāo)量的類(lèi)型(如NSInteger
和CGRect
等)微酬;
retain
: 指定retain
應(yīng)該調(diào)用對(duì)象上的绘趋。原始的對(duì)象在調(diào)用release
颤陶。在OS X v10.6和之后,您可以使用這個(gè)關(guān)鍵字用于內(nèi)存管理方面。
(4)陷遮、訪問(wèn)屬性的線程安全
nonatomic
:表示不考慮線程安全