2010-04-11 70 views
8

我试图通过Objective-C教程的方式工作。在这本书中有这样的例子:Objective-C getter/setter

@interface 
{ 
int width; 
int height; 
XYPoint *origin; 
} 
@property int width, height; 

我想,“嘿有针对的Xypoint对象中没有的getter/setter的代码不工作,虽然”现在我要去回答我自己的问题:)。

我认为它是因为“出身”是一个指针已经和什么有“宽度”和“高度”引擎盖下发生,是有打算TE创建一个指向他们..

上午我的权利,还是我说BS :) ??

我只是不知道它。这里的主:

#import "Rectangle.h" 
#import "XYPoint.h" 
int main (int argc, char *argv[]) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    Rectangle *myRect = [[Rectangle alloc] init]; 
    XYPoint *myPoint = [[XYPoint alloc] init]; 

    [myPoint setX: 100 andY: 200]; 
    [myRect setWidth: 5 andHeight: 8]; 

    myRect.origin = myPoint; 

    NSLog (@"Rectangle w = %i, h = %i", 
      myRect.width, myRect.height); 

    NSLog (@"Origin at (%i, %i)", 
      myRect.origin.x, myRect.origin.y); 

    NSLog (@"Area = %i, Perimeter = %i", 
      [myRect area], [myRect perimeter]); 

    [myRect release]; 
    [myPoint release]; 
    [pool drain]; 

    return 0; 
} 

而这里的矩形对象:

#import "Rectangle.h" 
#import "XYPoint.h" 

@implementation Rectangle 
@synthesize width, height; 

-(void) setWidth: (int) w andHeight: (int) h 
{ 
    width = w; 
    height = h; 
} 

- (void) setOrigin: (XYPoint *) pt 
{ 
    origin = pt; 
} 
-(int) area 
{ 
    return width * height; 
} 
-(int) perimeter 
{ 
    return (width + height) * 2; 
} 
-(XYPoint *) origin 
{ 
    return origin; 
} 
@end 

什么我不明白的是这一行主营:myRect.origin = myPoint;我并没有为它制定者..

BTW感谢为您的快速回复

回答

20

什么我不明白的是这条线在主:有myRect.origin = myPoint;我没有做一个二传手吧..

既是一个getter和一个setter(统称为存取)在Rectangle类中为origin创建。如果你在为Rectangle实施一看,这是消气:

-(XYPoint *) origin 
{ 
    return origin; 
} 

,这是二传:

- (void) setOrigin: (XYPoint *) pt 
{ 
    origin = pt; 
} 

,并作为Objective-C的2.0呼叫:

myRect.origin = myPoint; 

相当于:

[myRect setOrigin:myPoint]; 

使用@property声明getter和setter方法(然后使用@synthesize实现它们)正在申报和创建存取的只有一条路,而且是有一个方便的,如果你有大量的属性在类接口声明。作为Schildmeijer说,@property int width是等于宣告了两个方法:

- (int)width; 
- (void)setWidth:(int)newWidth; 

由于Objective-C的方法调用的动态绑定的性质,你甚至没有申报的getter和setter方法界面,尽管如果您将这些界面广告为其他类别公开可用,那么这样做通常是最佳做法。

6

您可以将属性声明视为等价于声明两个存取方法。因此

@property int width; 

等同于:

- (int)width; 

- (void)setWidth:(int)newWidth; 
0

你不说什么代码工作,或者你的期望是“工作”是什么。

上述接口将创建简单的宽度和高度访问器方法,可以从其他对象调用[object setWidth:1];object.width = 1; - 这两个类似。

原产地是一些其他的对象类型,是一个指针,是的。但是你仍然想声明一个属性来生成访问器方法。

0

如果您需要从另一个类访问实例变量,或者使用绑定来获取/设置它们,则获取器和设置器非常有用。所以我的猜测是,你需要这个功能的宽度和高度,但不是原点。请注意,getters/setters不会在整数中指出指针,因为您声明的可能是原因。 Ints是整数,getter/setter不会改变它。

0
//Rectangle.h 
#import <Foundation/Foundation.h> 
@interface Rectangle : NSObject 
@property int Width; 
@property int Height; 
-(int)Area; 
@end 

//Rectangle.m 
#import "Rectangle.h" 
@implementation Rectangle 
@synthesize Width;/*Will create value Width , Setter called"setWidth" and Getter called "Width"*/ 
@synthesize Height;/*Will create value Height , Setter called"setHeight" and Getter called "Height"*/ 

-(int)Area 
{ 
    return Width*Height; 
} 
@end 


// main.m 
#import <Cocoa/Cocoa.h> 
#import "Rectangle.h" 
int main(int argc, const char * argv[]) 
{ 
    Rectangle *myRectangle = [Rectangle new]; 

    myRectangle.Width=3; 
    myRectangle.Height=5; 
    printf("Area = %d\n",[myRectangle Area]); 

    //Or 
    [myRectangle setWidth:5]; 
    [myRectangle setHeight:6]; 
    printf("Area = %d\n",[myRectangle Area]); 

} 

如果你想吸气剂只或重命名getter和setter

•只读

•吸气= newGetterName

•二传手=新SetterName

例如

//Rectangle.h 
#import <Foundation/Foundation.h> 
@interface Rectangle : NSObject 
@property (getter = getWidth) int Width; 
@property (readonly) int Height; 
@end