Геттер / сеттер Objective-C

Я пытаюсь пройти через учебник по Objective-C. В книге есть такой пример:

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

Я подумал: «Эй, нет геттера / сеттера для объекта XYPoint. Тем не менее, код работает». Теперь, может быть, я отвечу на свой вопрос :).

Я думаю, это потому, что «origin» уже является указателем, а то, что происходит под капотом с «шириной» и «высотой», заключается в том, что на них будет создан указатель.

Я прав, или я говорю чушь :) ??

Я просто не понимаю. вот главное:

#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; Я не делал для нее сеттер ..

Кстати, спасибо за быстрый ответ


person pic-o-matic    schedule 11.04.2010    source источник


Ответы (5)


Я не понимаю, что это основная строка: myRect.origin = myPoint; Я не делал для нее сеттер ..

Для origin в классе Rectangle созданы геттер и сеттер (вместе именуемые аксессорами). Если вы посмотрите на реализацию для Rectangle, это будет получатель:

-(XYPoint *) origin
{
    return origin;
}

а это сеттер:

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

И что касается вызова Objective-C 2.0:

myRect.origin = myPoint;

эквивалентно:

[myRect setOrigin:myPoint];

Объявление геттеров и сеттеров с использованием @property (а затем их реализация с использованием @synthesize) - это только один способ объявления и создания средств доступа, и он используется для удобства, если у вас есть много свойств для объявления в интерфейсе класса. Как сказано в Schildmeijer, @property int width эквивалентно объявлению двух методов:

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

Из-за динамически привязанного характера вызовов методов Objective-C вам даже не нужно объявлять методы получения и установки в интерфейсе, хотя обычно лучше сделать это, если вы рекламировать их как общедоступные для других классов.

person Alex Rozanski    schedule 11.04.2010

Вы можете рассматривать объявление свойства как эквивалент объявления двух методов доступа. Таким образом

@property int width;

эквивалентно:

- (int)width;

- (void)setWidth:(int)newWidth;
person Schildmeijer    schedule 11.04.2010

//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 = newGetterName

• setter = новый SetterName

пример

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

Вы не говорите, какой код работает, или чего вы ожидаете от «работы».

Вышеупомянутый интерфейс создаст простые методы доступа для ширины и высоты, которые можно вызывать из других объектов как [object setWidth:1]; или object.width = 1; - эти два аналогичны.

Происхождение - это какой-то другой тип объекта и это указатель, да. Но вы все равно захотите объявить свойство для создания методов доступа.

person Paul Lynch    schedule 11.04.2010

Геттеры и сеттеры в основном полезны, если вам нужно получить доступ к переменной экземпляра из другого класса или вы используете привязки для их получения / установки. Итак, я предполагаю, что вам понадобится эта функция для ширины и высоты, но не для начала координат. Обратите внимание, что геттеры / сеттеры не делают указатели из целых чисел, как вы указали, может быть причиной. Ints - это целые числа, а геттеры / сеттеры этого не меняют.

person regulus6633    schedule 11.04.2010