Я внимательно прочитал уже опубликованные вопросы и не могу найти ответ, который ищу.
Я полностью понимаю концепцию использования директивы @syntesize
для создания методов получения и установки (т. Е. Если у меня было @property int width
и @synthesize width
, я непреднамеренно создаю метод получения width
и метод установки setWidth:
).
Однако, когда я не использую директиву @synthesize
, а объявляю переменные экземпляра в разделе @implementation
, которые являются объектами, я не до конца понимаю, как работают методы доступа. Вот что я не понимаю в следующем коде:
1) в main
, где говорится:
NSLog(@"Origin at (%i, %i)", myRect.origin1.x, myRect.origin1.y);
Мне кажется, что он будет вызывать метод [[myRect origin1] x]
, который сначала определит, что [myRect origin1]
возвращает origin
, а затем немедленно вызовет [origin x]
в результате (а затем сделает то же самое для * 1022). *). Что меня отталкивает, так это то, что если бы я изменил имя метода-получателя
-(XYpoint *) origin1;
содержится в Rectangle.h до
-(XYpoint *) origin2;
программа получает массу ошибок и перестает компилироваться. Примечание: я также менял имя этого метода везде, на который он ссылается, включая изменение предыдущего кода в main на
NSLog(@"Origin at (%i, %i)", myRect.origin2.x, myRect.origin2.y);
Однако, если я также изменю имя метода установки с:
-(void) setOrigin1: (XYpoint *) pt
до:
-(void) setOrigin2: (XYpoint *) pt
тогда все работает как раньше. Мне кажется, это работает правильно только тогда, когда мои геттер и сеттер названы в соответствии с x
setX
соглашением об именах. Я предположил, что это в основном то, что мне нужно объяснить:
A) Если я создаю переменную экземпляра, которая оказывается объектом (например, в данном случае 'origin'), я должен создать для нее методы получения и установки?
B) Могу ли я создать метод получения, но не метод установки или наоборот
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;
}