標籤:style blog http io ar color 使用 sp for
在上一篇博文中,我們有拿一個簡單的“汽車模型”來講解複合關係。在今天的這篇博文中,我們將接著上一次的例子,講解下存取(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的存取方法:
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中定義的儲存方法:
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 *) tire13 atIndex:(int) index14 {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) index25 {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架構中的存取方法的使用方法有更深的瞭解。
《objective-c基礎教程》學習筆記(七)—— 存取方法