2012-01-11 129 views
4

我剛剛從一本我拾起的書(大書呆子牧場)中學習OOP,它只是通過了getter和setter章節。我只想澄清我明白我剛剛做了什麼。除了創建方法來設置實例的值,還有另一種方法來提取值並顯示它,我創建了使用@property@synthesize語法來定義這兩種方法。Getter和Setter解釋?

-(void) setHeightOfObject:(int)h; 
-(void) setWeightOfObject:(float)w; 
-(int) heightOfObject; 
-(float) weightOfObject; 

,並定義它像這樣:

而不是做這個的

@property int heightOfObject; 
@property float weightOfObject; 

- (int)heightOfObject 
{ 
    return heightOfObject; 
} 

- (void)setHeightOfObject:(int)h 
{ 
    heightInMeters = h; 
} 

- (float)weightOfObject 
{ 
    return weightOfObject; 
} 

- (void)setWeightOfObject:(float)w 
{ 
    weightOfObject = w; 
} 

我會getter和setter方法在.h文件中做到這一點然後轉到我的.m文件並鏈接它:

@synthesize heightInMeters, weightOfObject; 

然後,這使我能夠設置我的對象的值,然後得到它,如果我需要它打印?我知道這是一個重要的概念,我想確保我有適當的把握。

回答

3

你是對的。必要的擴展到您在編譯時編寫的實現。

由於編寫getter和setter是無聊和重複的(並且大多數對象都有一些屬性,所以你需要獲取getters和setters)有這個小小的快捷方式使得你花更少的時間在boilerplate code上,並且有更多的時間執行一些有趣的事情。

如果您想了解有關objective-c屬性的更多詳細信息,可以查看programming guide(儘管此時可能對您有些不必要地詳述)。

+0

太棒了,我將在稍後的編程之旅中檢查鏈接 – David 2012-01-11 22:42:55

0

你不僅得到getter和setter。你也可以得到一個整潔的語法:self.heightOfObject,你可以指定或讀取它。 @property有很多設置,所以你可能想要詳細閱讀。尤其是,您可以控制是否需要讀取和寫入權限,或者只需要其中一項權限。

1

您通過使用@property和@synthesize有兩個部分。

@property告訴編譯器它應該允許你使用點語法來調用heightOfObject和weightOfObject的訪問器。這樣算下來,

int height = myObject.heightOfObject; 
myObject.weightOfObject = 10; 

成爲法人代碼是完全等價的:

int height = [myObject heightOfObject]; 
[myObject setWeightOfObject:10]; 

你可以使用@property沒有@synthesize,在這種情況下,你必須完全實現存取,你在做了你的問題。

使用@synthesize會告訴編譯器它應該爲您生成訪問器,如果您的運行時支持(例如,在iOS和64位OS X上),它也會自己生成實例變量。

+0

謝謝,那正是我想知道的。 – David 2012-01-11 22:42:42