2012-05-26 32 views
2

我正在嘗試一些東西,因爲我正在學習有關@property@synthesize。我認爲@property創建了實例變量,並且@synthesize爲它創建了getter和setter方法。使用@property和@synthesize創建存取方法和ivars的詳細信息

#import <Foundation/Foundation.h> 

@interface XYPoint : NSObject 
@property int x, y; 

-(void) setX: (int) xVar andY: (int) yVar; 

@end 

我沒有在我的實現文件中合成xy,但我不知道爲什麼我被允許做兩件事:

-(void) setX:(int)x { 
    x = x; 
} 

-(void) setY:(int)y { 
    y = y; 
} 

但有大約未經宣佈的標識符xy錯誤消息當我這樣做:

-(void) setX:(int)xVar andY:(int)yVar { 
    x = xVar; 
    y = yVar; 
} 

而且,爲什麼沒有-(void) setY:(int)y和必須在接口文件中聲明?

回答

2

我以爲@property創建了實例變量,@synthesize爲它創建了getters和setters方法。

這是不完全正確的。 @property聲明基本上只是承諾給其他類:「你可以問我一個名爲xint,我也會迴應試圖給我一個int來存儲這個名字。」聲明本身不會在課堂上創建任何東西,無論是方法還是伊娃。

這是@synthesize這些東西。你可以自己實現你自己的setter,getter和ivar,或者你可以綜合它們(或者任何組合)。

所以你得到的錯誤,當你不使用@synthesize的原因是沒有實例變量被創建,所以xy是不是你可以在類中使用的名稱。

在第一種情況下,你沒有做你認爲自己在做的事情。在這種方法中:

-(void) setX:(int)x { 
    x = x; 
} 

x是參數的名稱,你只是將其分配給自己。 (你不能在同一範圍內有兩個相同名字的變量,如果你的創建了一個名爲x的ivar,你會得到一個關於陰影ivar的方法參數的編譯器警告,這意味着參數名稱,是一樣的伊娃,不會允許你訪問伊娃)

如果更改到:

-(void) setX:(int)newX { 
    x = newX; 
} 

你會看到大約x是不宣而同樣的錯誤。

此外,爲什麼-(void) setY:(int)y-(void) setX:(int)x必須在接口文件中聲明?

它們是由@property指令聲明的。

0

它看起來像我只是分配你的參數變量他們已經有的值。這是怎麼回事,如果你改變你的參數名稱可能更有意義:

-(void) setX:(int)xVar { 
    x = xVar; 
} 

-(void) setY:(int)yVar { 
    y = yVar; 
} 

錯誤消息應該然後是一致的。