一.setter和getter的一般寫法
setter
和getter
器可以說是一個類最基本的東西,任何一門面向對象的語言,都又這個概念,C++
、Java等等。因為setter
和getter
是對面向對象語言封裝的最基本的支持。
在Objective-C
的setter
和getter
器,當然也和一般的語言沒有什么不同。只不過,添加了一些自己的特性。
比如有一個實例變量:int age
;
先在.h
文件中聲明setter
和getter
器
- (void)setAge:(int)newAge;
- (int)age;
然后在.m
文件中具體實現
- (void)setAge:(int)newAge
{
age=newAge;
}
- (int)age
{
return age;
}
可以看出來,在Objective-C
中setter
器沒什么區別,不過getter
器的方法名缺少了get
,因為get
在Objective-C
有別的用處,所以getter
器直接寫的就是變量名。
二、getter和setter 的調用方法
一般的調用方法,是傳統的帶中括號[ ]
的調用方法,比如
//比如上面的聲明是一個Person類
Person* person=[[Person alloc]init];
[person setAge:13];
int age=[person age];
點調用的方式
//點調用
person.age=13; //.調用出現在=號左邊,相當于setter
int age=person.age //.調用出現在=號的右邊,相當于getter
NSLog(@"%i",person.age);//這也是getter
三、setter和getter的改進寫法
每次要為一個屬性寫上getter
和setter
,不得不手十分麻煩,所以有了更簡單的寫法,
在.h
文件里,直接這樣寫,表示聲明了一個實例屬性和它的getter
和setter
器
@property int age;
然后在.m
文件中這樣寫,表示實現setteer
和getter
@synthesize age;
這樣,就可以和以前一樣調用getter
和setter
了。
四、setter和getter的改進優化
可以看到,getter
器的方法名直接就是變量名,方法名和變量名一樣,容易讓人迷糊,所以,可以這樣優化。
在.h
文件中依然這樣聲明
@property int age;
在.m
文件中,這樣去寫,
@synthesize age=_age; //加上一個_
//這么,我們就可以去使用_age 和使用age一樣
-(void)show
{
NSLog(@"%i",_age);
}
五、@property
的屬性
可以使用屬性來規定@property
,設定的方式如下:
@property (attribute1[,attrubute2,...])
舉個例子:
@property (nonatomic,strong) Engine* engine;
如果你在@property
設置了屬性,如果你使用@synthesize
,那么它會自動幫你完成這些屬性的實現,如果你是自己手動的去完成實現的話,那么,你必須自己寫出這些屬性的實現。
(1)、設置訪問方法的名字
默認的getter
和setter
器的名稱是和變量名關聯的,一定是setVirableName
和virableName
,比如上面的變量age
,setter
是setAge
,getter
是age
。
可以通過設置@property
中的setter
和getter
屬性來修改setter
和getter
器的方法名。
getter=getterName
setter=setterName
舉個例子:
@property (getter=show1,setter=show2:)int age;//現在,它的getter和setter的方法名字就變了
注意:如果你設置了readonly
屬性的話,那么你就不應該設置setter
屬性,要不然會給出一個編譯器的警告。
(2)、設置只讀或讀寫
下面兩個屬性很好理解,
readwrite
:表示既有getter
,也有setter
readonly
:表示只有getter
,沒有setter
這兩個屬性是互相排斥的,只能存在一個。
(3)、定義setter
的語義
下面的屬性指定setter
語義設置訪問器。他們是互相排斥的。
strong
:指定有很強的(擁有)關系到目標對象。
weak
:指定有弱(non-owning)
關系到目標對象。如果目的地對象銷毀,屬性值將自動設置為nil。(弱屬性不支持OS X上的v10.6和iOS4 ,使用指定取而代之)。
copy
:調用原始對象的copy()
方法,創建一個原始對象的副本,用于分配給新的引用。原始的對象在調用release
方法。當然這個屬性只用于實現了NSCopying
協議的對象類型。
assign
:指定使用簡單的賦值的setter
。這個屬性是違約。 使用這個屬性對于標量的類型(如NSInteger
和CGRect
等);
retain
: 指定retain
應該調用對象上的。原始的對象在調用release
。在OS X v10.6和之后,您可以使用這個關鍵字用于內存管理方面。
(4)、訪問屬性的線程安全
nonatomic
:表示不考慮線程安全