getter 和 setter 是對(duì)實(shí)例變量的一個(gè)設(shè)置和調(diào)用的作用
平時(shí)我們的實(shí)例變量都是@public的形式,這個(gè)形勢(shì)的實(shí)例變量誰(shuí)都可以去修改谦炬,跟我們現(xiàn)實(shí)中的某種職業(yè)一樣昔榴。
這個(gè)時(shí)候就體現(xiàn)出封裝的作用了逞怨,我定義的實(shí)例變量只能我讓你用,你才能用耍鬓。我讓你怎么去用阔籽,你才能怎么取用。
怎么才能實(shí)現(xiàn)我的霸權(quán)注意呢牲蜀? 這個(gè)時(shí)候@protected的作用的出來(lái)了笆制。我給我的數(shù)據(jù)建立了一個(gè)籠子。如果你要用需要用
我給你的鑰匙才能進(jìn)去用我的東西涣达。這個(gè)就是getter 在辆,如果我想讓你怎么用证薇,你才能怎么用的時(shí)候 這個(gè)就是setter
一、setter和getter的一般寫法
setter和getter器可以說(shuō)是一個(gè)類最基本的東西匆篓,任何一門面向?qū)ο蟮恼Z(yǔ)言浑度,都又這個(gè)概念,C++鸦概、Java等等箩张。因?yàn)閟etter和getter是對(duì)面向?qū)ο笳Z(yǔ)言封裝的最基本的支持。
在Objective-C的setter和getter器窗市,當(dāng)然也和一般的語(yǔ)言沒有什么不同先慷。只不過(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器沒什么區(qū)別,不過(guò)getter器的方法名缺少了get扎拣,因?yàn)間et...在Objective-C有別的用處,所以getter器直接寫的就是變量名素跺。
二二蓝、getter和setter 的調(diào)用方法
一般的調(diào)用方法,是傳統(tǒng)的帶中括號(hào)[? ]的調(diào)用方法指厌,比如
//比如上面的聲明是一個(gè)Person類
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)寫法
每次要為一個(gè)屬性寫上getter和setter鸥诽,不得不手十分麻煩,所以有了更簡(jiǎn)單的寫法箕憾,
在.h文件里牡借,直接這樣寫,表示聲明了一個(gè)實(shí)例屬性和它的getter和setter器
@property int age;
然后在.m文件中這樣寫袭异,表示實(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文件中根竿,這樣去寫溜徙,
@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)的話冕广,那么疏日,你必須自己寫出這些屬性的實(shí)現(xiàn)。
(1)撒汉、設(shè)置訪問(wèn)方法的名字
默認(rèn)的getter和setter器的名稱是和變量名關(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è)置只讀或讀寫
下面兩個(gè)屬性很好理解啄巧,
readwrite:表示既有g(shù)etter寻歧,也有setter
readonly:表示只有g(shù)etter,沒有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ì)象銷毀,屬性值將自動(dòng)設(shè)置為nil卿城。(弱屬性不支持OS X上的v10.6和iOS 4,使用指定取而代之)铅搓。
copy:調(diào)用原始對(duì)象的copy()方法瑟押,創(chuàng)建一個(gè)原始對(duì)象的副本,用于分配給新的引用星掰。原始的對(duì)象在調(diào)用release方法多望。當(dāng)然這個(gè)屬性只用于實(shí)現(xiàn)了NSCopying協(xié)議的對(duì)象類型嫩舟。
assign:指定使用簡(jiǎn)單的賦值的setter。這個(gè)屬性是違約怀偷〖已幔 使用這個(gè)屬性對(duì)于標(biāo)量的類型(如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:表示不考慮線程安全