一、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; //.調用出現在=號左邊,相當於setterint age=person.age //.調用出現在=號的右邊,相當於getterNSLog(@"%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和iOS 4,使用指定取而代之)。
copy:調用原始對象的copy()方法,建立一個原始對象的副本,用於分配給新的引用。原始的對象在調用release方法。當然這個屬性只用於實現了NSCopying協議的物件類型。
assign:指定使用簡單的賦值的setter。這個屬性是違約。 使用這個屬性對於標量的類型(如NSInteger和CGRect等);
retain: 指定retain應該調用對象上的。原始的對象在調用release。在OS X v10.6和之後,您可以使用這個關鍵字用於記憶體管理方面。
(4)、訪問屬性的安全執行緒
nonatomic:表示不考慮安全執行緒