Я много читал уже опубликованные вопросы и не могу найти ответ, который я ищу.
Я полностью понимаю концепцию использования директивы @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;
}