Objective C - Accessors ie Getters/Setters

Я много читал уже опубликованные вопросы и не могу найти ответ, который я ищу.

Я полностью понимаю концепцию использования директивы @syntesize для создания getter и setter методов (т.е. если у меня есть @property int width и @synthesize width, я непреднамеренно создаю getter метод width и setter метод setWidth:).

Однако, когда я не использую директиву @synthesize, а объявляю переменные экземпляра в секции @implementation, которые являются объектами, я не совсем понимаю, как работают методы доступа. Вот что я не понимаю в следующем коде:

1) в main, где говорится:

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

Мне кажется, что вызывается метод [[myRect origin1] x], который сначала определяет, что [myRect origin1] возвращает origin, а затем немедленно вызывает [origin x] как результат (а затем делает то же самое для y). Теперь, что меня смущает, так это то, что если я изменю имя метода getter

-(XYpoint *) origin1;

содержащегося в Rectangle.h на

-(XYpoint *) origin2;

то программа получит кучу ошибок и перестанет компилироваться. Примечание: я также изменил имя этого метода везде, где на него ссылаются, включая изменение предыдущего кода в main на

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

Однако если я также изменю имя метода setter с:

-(void) setOrigin1: (XYpoint *) pt

на:

-(void) setOrigin2: (XYpoint *) pt

то все работает как прежде. Мне кажется, это работает правильно только тогда, когда мои getter и setter оба названы в соответствии с соглашением об именовании x setX. Я предполагаю, что это то, что мне нужно объяснить:

A) Если я создаю переменную экземпляра, которая оказывается объектом (как 'origin' в этом случае), я должен создать методы getter и setter для нее?

B) Могу ли я создать метод getter, но не метод setter или наоборот

C) Обязательно ли, если я создам метод getter и метод setter для 'origin', чтобы они оба были названы в стиле x setX. В данном случае как -(XYpoint *) origin1 и -(void) setOrigin1: (XYpoint *) pt. То есть, если я меняю имя геттера, я должен соответственно изменить имя сеттера?

Вот весь код:

Rectangle.h:

#import <Foundation/Foundation.h>
@class XYpoint;

@interface Rectangle : NSObject

@property int width, height;

-(XYpoint *) origin1;
-(void) setOrigin1: (XYpoint *) pt;
-(void) setWidth: (int) w andHeight: (int) h;
-(int) area;
-(int) perimeter;

@end

Rectangle.m:

#import "Rectangle.h"

@implementation Rectangle
{
    XYpoint *origin;
}

@synthesize  width, height;

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


-(void) setOrigin1: (XYpoint *) pt
{
    origin = pt;
}

-(int) area
{
    return width * height;
}

-(int) perimeter
{
    return (width + height) * 2;
}

-(XYpoint *) origin1
{
    return origin;
}

@end

XYpoint.h:

#import <Foundation/Foundation.h>

@interface XYpoint : NSObject

@property int x, y;

-(void) setX: (int) xVal andY: (int) yVal;
@end

XYpoint.m:

#import "XYpoint.h"

@implementation XYpoint

@synthesize x,y;

-(void) setX: (int) xVal andY: (int) yVal
{
    x = xVal;
    y = yVal;
}
@end

main.m:

#import <Foundation/Foundation.h>
#import "Rectangle.h"
#import "XYpoint.h"

int main (int argc, const char * argv[])
{

    @autoreleasepool {
        Rectangle *myRect = [[Rectangle alloc] init];
        XYpoint *myPoint = [[XYpoint alloc] init];

        [myPoint setX: 100 andY: 200];
        [myRect setWidth: 5 andHeight:8];
        myRect.origin1 = myPoint;
        NSLog(@"Rectangle w = %i, h = %i", myRect.width, myRect.height);
        NSLog(@"Origin at (%i, %i)", myRect.origin1.x, myRect.origin1.y);
        NSLog(@"Area = %i, Perimeter = %i", [myRect area], [myRect perimeter]);
    }
    return 0;
}
6
задан Alex 20 December 2011 в 18:02
поделиться