在上一篇博文中,咱們有拿一個簡單的「汽車模型」來說解複合關係。在今天的這篇博文中,咱們將接着上一次的例子,講解下存取(accessor)方法的使用。所謂存取方法,就是用來讀取或改變某個對象屬性的方法。若是添加一個方法去改變Car對象中的engine對象變量,那它就是一個存取方法。數組
存取方法分爲兩種:setter方法和getter方法。setter方法,是爲對象中的變量賦值。getter方法,是經過對象自己訪問對象屬性。安全
在Objective-c中,Cocoa框架在定義存取方法的時候,有相關的規定:框架
(1). setter方法,根據它的所要去改變的屬性名稱來命名,並在前面加set前綴。如:setEngine,setTire等。函數
(2). getter方法,則是以其返回的屬性名稱來命名,不要將get前綴加到getter方法名前面。由於在Cocoa中,get前綴有其餘的用途。通常意味着這個方法會將你傳遞的參數做爲指針來返回數值。性能
介紹完了基本的概念和定義的規則。下面,咱們就來修改「汽車模型」,給汽車的engine和tire設置存取方法。學習
首先,先在Car對象定義中添加engine和tire的存取方法:atom
1 @interface Car : NSObject 2 { 3 Engine *engine; 4 Tire *tires[4]; //四個輪子,定義一個四個數的數組。 5 } 6 -(Engine *) engine; 7 -(void) setEngine:(Engine *) newEngine; 8 -(Tire *) tireAtIndex:(int) index; 9 -(void) setTire:(Tire *) tire atIndex:(int) index; 10 -(void) drive; 11 @end // Car
因爲,tire有四個子集,因此這裏還添加了一個atIndex參數,表示第幾個輪子。接下來,實現Car中定義的存儲方法:spa
1 @implementation Car 2 -(void) setEngine:(Engine *) newEngine 3 { 4 engine = newEngine; 5 } 6 7 -(Engine *) engine 8 { 9 return (engine); 10 } 11 12 -(void) setTire:(Tire *) tire 13 atIndex:(int) index 14 { 15 if(index<0 || index>3) 16 { 17 NSLog(@"bad index(%d) in setTire:atIndex", 18 index); 19 exit(1); 20 } 21 tires[index] = tire; 22 } 23 24 -(Tire *) tireAtIndex:(int) index 25 { 26 if(index<0 || index>3) 27 { 28 NSLog(@"bad index(%d)in tireAtIndex:", 29 index); 30 exit(1); 31 } 32 return (tires[index]); 33 } 34 35 -(void) drive{ 36 NSLog(@"%@",engine); 37 NSLog(@"%@",tires[0]); 38 NSLog(@"%@",tires[1]); 39 NSLog(@"%@",tires[2]); 40 NSLog(@"%@",tires[3]); 41 } 42 @end
爲了傳入的index參數不符合條件,使得超出數組,咱們作了簡單的判斷。最後,咱們修改main主函數:線程
1 int main(int argc, const char * argv[]) 2 { 3 Car *car = [Car new]; 4 Engine *engine = [Engine new]; 5 [car setEngine:engine]; 6 for(int i=0;i<4;i++) 7 { 8 Tire *tire = [Tire new]; 9 [car setTire:tire atIndex:i]; 10 } 11 12 [car drive]; 13 return 0; 14 }
這時,咱們發現:以前在Car中定義的init初始化方法,這邊移除掉了。因爲Car如今本身定義了訪問engine和tires變量的方法。因此,不須要init方法來建立。而是直接在主函數中建立Engine和Tire。指針
運行結果和以前的沒有區別:
經過這個簡單修改的例子,但願你們對Cocoa框架中的存取方法的使用方法有更深的瞭解。
2014.12.07 後續更新部分
在這幾天的學習中,發現Objective-C在實際的使用了,不少都是用合併存取方法來實現。全部,這裏,我想擴展給你們一塊兒分享下。
讓系統自動合併setter和getter只要兩個步驟:
(1). 在類接口部分使用@property指令定義屬性。
(2). 在類實現的部分使用synthesize指令聲明該屬性便可。
全部,上面例子中定義Engine的存取方法咱們能夠修改爲如下代碼:
原來的setter方法和getter方法能夠合併改爲:
1 /* 3.Car */ 2 @interface Car : NSObject 3 { 4 Engine *engine; 5 Tire *tires[4]; //四個輪子,定義一個四個數的數組。 6 } 7 @property(nonatomic)Engine* engine; 8 @end // Car
實現方法只要這樣:
1 @implementation Car 2 @synthesize engine; 3 @end;
在使用@property指令的時候,後面會帶上一些參數,具體的做用這邊大體介紹下。要想深刻了解,能夠以後本身百度之。
atomic(nonatomic):指定合成的存儲方法是否爲原子操做。即:主要指是否線性安全。aomic能夠保證對象數據完整性,可是線程的安全性下降。nonatomic能夠提升存儲方法的訪問性能。
copy:當調用setter方法對成員變量賦值的時候,會將被賦值的對象複製成一個副本,再將該副本賦值給成員變量。copy指令能夠避免當計數器的值爲0的時候,對象被清除。
readonly:指示系統只合成getter方法,再也不合成setter方法。即:定義的方法只讀,不能給賦值。
readwrite:是默認值,指示系統須要合成setter,getter方法。
retain:當把某個對象賦值給該屬性時,該屬性原來所引用的對象的引用數減1,被賦值對象的引用數加1。(ARC內存機制中用到)
retainCount:獲取引用的對象的引用數。
weak:指示符指定該屬性對被賦值對象持有弱引用。即:即便該弱引用指向被賦值的對象,該對象也可能被回收。
strong:指示符指定該屬性對被賦值對象持有強引用。即:只要該搶引用指向被賦值的對象,那麼該對象就不會自動回收。