【问题标题】:Objective-C getter/ setterObjective-C getter/setter
【发布时间】:2010-04-11 09:34:47
【问题描述】:

我正在努力学习 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

我不明白的是 main 中的这一行:myRect.origin = myPoint; 我没有为它做一个二传手..

顺便感谢您的快速回复

【问题讨论】:

    标签: objective-c setter getter


    【解决方案1】:

    我不明白的是 main 中的这一行:myRect.origin = myPoint; 我没有为它制作 setter..

    Rectangle 类中origin 创建了一个getter 和一个setter(统称为accessors)。如果您查看 Rectangle 的实现,这就是 getter:

    -(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 方法,尽管这样做通常是最佳实践如果您将它们宣传为对其他课程公开可用。

    【讨论】:

      【解决方案2】:

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

      @property int width;
      

      相当于:

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

      【讨论】:

        【解决方案3】:
        //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
        

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 2023-03-12
              • 1970-01-01
              • 2012-11-17
              • 1970-01-01
              • 1970-01-01
              • 2013-02-25
              • 2016-11-30
              • 2012-05-12
              • 1970-01-01
              相关资源
              最近更新 更多