面試的時候經(jīng)常會被問到getter和setter的寫法及作用,總結(jié)一下:
setter和getter是一個類最基本的東西器净,面向?qū)ο蟮恼Z言都有這個概念枪向,它是對面向?qū)ο笳Z言封裝的最基本的支持齿税。
一:Objective-C的getter和setter的實現(xiàn): 比如有一個實例變量:int age;(用setter和getter時要先聲明實例變量)
1:在.h文件中聲明setter和getter
-(void)setAge:(int)newAge; ? ? ? ? //setter
-(int)age; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//getter
2:在.m文件中實現(xiàn)
-(void)setAge:(int)newAge
{
?? ? ? ? ? age=newAge;
}
-(int)age
{
? ? ? ? ? ? ?return?age;
}
二:Objective-C的getter和setter的調(diào)用
一般的調(diào)用方法[];
//比如上面的聲明是一個Person類
Person*person = [[Person?alloc]init];
[person?setAge:13];
intage = [person?age];
點語法調(diào)用方式寞奸;
person.age=13; ? ? ? ?//.調(diào)用出現(xiàn)在=號左邊,相當(dāng)于setter
intage=person.age???//.調(diào)用出現(xiàn)在=號的右邊括丁,相當(dāng)于getter
NSLog(@"%i",person.age); ? ? ? //這也是getter
三荞下、setter和getter的改進(jìn)寫法
@property int age; ? ? .h中直接這樣寫,表示聲明了一個實例屬性和它的getter和setter方法史飞。
@synthesize age; ? ? ? .m中這樣寫尖昏,表示實現(xiàn)setter和getter方法。
這樣實現(xiàn)之后就可以像上面調(diào)用方式一樣調(diào)用setter和getter方法了构资。
這種方式的getter方法名直接就是變量名会宪,這樣就容易混淆,所以.m中可以做一步
@synthesize age = _age; ? ? ? //加上一個_蚯窥。這時就可以使用_age 和使用age是一樣的掸鹅。
四:@property的屬性
談到setter和getter就一定會提到@property屬性生成器
@property設(shè)置了屬性塞帐,使用@synthesize 會自動完成這些屬性的實現(xiàn),如果手動的去完成實現(xiàn)的話巍沙,必須寫出這些屬性的實現(xiàn)葵姥。
屬性修飾符簡單總結(jié)(
1)、設(shè)置只讀或讀寫
下面兩個屬性很好理解句携,
readwrite:表示既有g(shù)etter榔幸,也有setter
readonly:表示只有g(shù)etter,沒有setter
這兩個屬性是互相排斥的矮嫉,只能存在一個削咆。
2)、定義setter的語義
下面的屬性指定setter語義設(shè)置訪問器蠢笋。他們是互相排斥的拨齐。
strong:指定有很強的(擁有)關(guān)系到目標(biāo)對象。
weak:指定有弱(non-owning)關(guān)系到目標(biāo)對象昨寞。如果目的地對象銷毀,屬性值將自動設(shè)置為nil瞻惋。(弱屬性不支持OS X上的v10.6和iOS4,使用指定取而代之)援岩。
copy:調(diào)用原始對象的copy()方法歼狼,創(chuàng)建一個原始對象的副本,用于分配給新的引用享怀。原始的對象在調(diào)用release方法羽峰。當(dāng)然這個屬性只用于實現(xiàn)了NSCopying協(xié)議的對象類型。
assign:指定使用簡單的賦值的setter添瓷。這個屬性是違約限寞。 使用這個屬性對于標(biāo)量的類型(如NSInteger和CGRect等)仰坦;
retain: 指定retain應(yīng)該調(diào)用對象上的。原始的對象在調(diào)用release计雌。在OS X v10.6和之后,您可以使用這個關(guān)鍵字用于內(nèi)存管理方面悄晃。
3)、訪問屬性的線程安全
nonatomic:表示不考慮線程安全