Objective-C getter/setter

pic*_*tic 10 getter setter objective-c

我正在尝试通过Objective-C教程.书中有这个例子:

@interface
{
 int width;
 int height;
 XYPoint *origin;
}
@property int width, height;
Run Code Online (Sandbox Code Playgroud)

我想,"嘿,XYPoint对象没有getter/setter.代码确实有用." 现在我要回答我自己的问题:).

我认为它是因为"原点"已经是一个指针,并且在"宽度"和"高度"的引擎盖下发生的事情是,将会创建一个指向它们的指针.

我是对的,还是我在说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;
}
Run Code Online (Sandbox Code Playgroud)

这是Rectangle对象:

#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
Run Code Online (Sandbox Code Playgroud)

我不明白的主要是这一行:myRect.origin = myPoint;我没有为它制作一个二传手.

顺便说一句,谢谢你的快速回复

Ale*_*ski 23

我不明白的主要是这一行:myRect.origin = myPoint;我没有为它制作一个二传手.

两者的吸气剂和一个setter(统称为访问器用于创建)originRectangle类.如果您查看实现Rectangle,这是getter:

-(XYPoint *) origin
{
    return origin;
}
Run Code Online (Sandbox Code Playgroud)

这是二传手:

- (void) setOrigin: (XYPoint *) pt
{
    origin = pt;
}
Run Code Online (Sandbox Code Playgroud)

从Objective-C 2.0调用开始:

myRect.origin = myPoint;
Run Code Online (Sandbox Code Playgroud)

相当于:

[myRect setOrigin:myPoint];
Run Code Online (Sandbox Code Playgroud)

使用@property(然后使用它们@synthesize)声明getter和setter 只是声明和创建访问器的一种方式,如果你有很多属性要在类接口中声明,那么这是方便的.如上所述Schildmeijer,@property int width相当于声明两种方法:

- (int)width;
- (void)setWidth:(int)newWidth;
Run Code Online (Sandbox Code Playgroud)

由于Objective-C方法调用的动态绑定特性,您甚至不必在界面中声明getter和setter方法,尽管通常最好的做法是将其公布为其他公开的方法.类.


Sch*_*jer 6

您可以将属性声明视为等同于声明两个存取方法.从而

@property int width;
Run Code Online (Sandbox Code Playgroud)

相当于:

- (int)width;

- (void)setWidth:(int)newWidth;
Run Code Online (Sandbox Code Playgroud)