11

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

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

我想,“嘿,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;
}

这是 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

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

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

4

5 回答 5

24

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

在类同时创建了一个 getter 和一个 setter(统称为访问器)。如果您查看 的实现,这就是 getter:originRectangleRectangle

-(XYPoint *) origin
{
    return origin;
}

这是二传手:

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

从 Objective-C 2.0 开始调用:

myRect.origin = myPoint;

相当于:

[myRect setOrigin:myPoint];

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

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

由于 Objective-C 方法调用的动态绑定特性,您甚至不必在接口中声明 getter 和 setter 方法,尽管如果您将它们宣传为对其他人公开可用,通常最好这样做类。

于 2010-04-11T11:25:06.957 回答
7

您可以将属性声明视为等同于声明两个访问器方法。因此

@property int width;

相当于:

- (int)width;

- (void)setWidth:(int)newWidth;
于 2010-04-11T09:41:02.623 回答
2
//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 或重命名 getter 和 setter

• 只读

• getter = newGetterName

• setter = 新的 SetterName

例子

//Rectangle.h
#import <Foundation/Foundation.h>
@interface Rectangle : NSObject
@property (getter = getWidth) int Width;
@property (readonly) int Height;
@end
于 2015-03-13T12:00:19.010 回答
0

你没有说什么代码在工作,或者你对“工作”的期望是什么。

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

Origin 是其他一些对象类型,是一个指针,是的。但是您仍然希望为其声明一个属性以生成访问器方法。

于 2010-04-11T09:42:07.577 回答
0

如果您需要从另一个类访问实例变量,或者您正在使用绑定来获取/设置它们,则 getter 和 setter 最有用。所以我的猜测是你需要这个功能来处理宽度和高度,而不是原点。请注意,getter/setter 不会像您所说的那样从整数中生成指针,这可能是原因。整数是整数,getter/setter 不会改变这一点。

于 2010-04-11T09:45:48.757 回答