2014-11-17 33 views
-1

我努力學習目標C和我期待通過一些簡單的代碼來弄明白。下面是一個頭文件的例子:在Obj C中,頭文件中的@property是什麼意思?

#import <Foundation/Foundation.h> 
@class XYPoint; 
@interface Rectangle: NSObject 
{ 
int width; 
int height; 
XYPoint *origin; 
} 
@property int width, height; 
-(XYPoint *) origin; 
-(void) setOrigin: (XYPoint *) pt; 
-(void) setWidth: (int) w andHeight: (int) h; 
-(int) area; 
-(int) perimeter; 
@end 

任何人都可以解釋「@property int width,height;」這一行的含義嗎?謝謝!

回答

3

該屬性的語法允許聲明一個getter的組合,並在很短的語法制定者。在你的代碼中,聲明創建四種方法:

-(int) width; 
-(void)setWidth:(int)val; 
-(int) height; 
-(void)setHeight:(int)val; 

有可能實現,也它關係這些方法自己的「靠山變量」與上述定義的名稱widthheight;也有可能在.m文件一個@synthesize指令。

在Objective-C的當前版本後盾變量的聲明是不必要的:所有的屬性默認情況下合成的,但如果你願意,你可以提供自己的實現。

屬性支持調用在Objective-C getter和setter方法的另一種方式:除了標準

int h = [point height]; 
[point setWidth:123]; 

你可以寫

int h = point.height; 
point.width = 123; 

這是沒有必要的屬性申報使用點語法:可以使用點語法調用任何不帶參數的返回值方法或使用單個參數的setter方法。

1

這僅僅是一個對其他類指之間{和}宣佈私人的ivars方式。

基本上,它會創建一個getter和一個setter,即,對於基本類型如int看起來就像這樣:

- (int)width 
{ 
    return width; 
} 

- (void)setWidth:(int)width 
{ 
    _width = width; 
} 

如果你願意,你可以覆蓋這2種方法。

按照慣例,底層實例變量應該有前綴「_」:

@interface Rectangle: NSObject 
{ 
    int _width; 
    int _height; 
    XYPoint *_origin; 
} 

如果你不聲明它們,編譯器會替你,但要小心,如果你超越無論是getter和二傳手,你需要添加這類語句中的「.M」文件:

@synthesize width = _width; 

,因爲在這種情況下,編譯器不會產生代表你的‘_width’伊娃。