Я пытаюсь проложить себе путь через учебное руководство Objective C. В книге существует этот пример:
@interface
{
int width;
int height;
XYPoint *origin;
}
@property int width, height;
Я думал, "эй нет никакого метода считывания/метода set для объекта XYPoint. Код действительно работает все же." Теперь я собираюсь, возможно, ответить на свой собственный вопрос :).
Я думаю, потому что "источник" уже является указателем, и что происходит под капотом с "шириной" и "высотой", то, что там идет te быть созданным указатель на них..
Действительно ли я прав, или я говорю БАКАЛАВР НАУК :)??
Я просто не получаю его. здесь является основным:
#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;
}
И вот Прямоугольный объект:
#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;
Я не сделал метод set для него..
BTW благодарит за Ваш быстрый ответ
Что я не понимаю, так это эту строку в main:
myRect.origin = myPoint;
Я не сделал для нее сеттер...
Для origin в классе Rectangle
созданы и getter, и setter (совместно называемые accessors) для origin
. Если вы посмотрите на реализацию для Rectangle
, то это getter:
-(XYPoint *) origin
{
return origin;
}
и это setter:
- (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, вы даже не обязаны объявлять методы getter и setter в интерфейсе, хотя это, как правило, лучшая практика, если вы объявляете их общедоступными для других классов.
Геттеры и сеттеры в основном полезны, если вам нужно получить доступ к переменной экземпляра из другого класса или вы используете привязки для их получения / установки. Итак, я предполагаю, что вам понадобится эта функция для ширины и высоты, но не для начала координат. Обратите внимание, что геттеры / сеттеры не делают указатели из целых чисел, как вы указали, может быть причиной. Ints - это целые числа, а геттеры / сеттеры этого не меняют.
Вы можете рассматривать объявление свойства как эквивалент объявления двух методов доступа. Таким образом,
@property int width;
эквивалентно:
- (int)width;
- (void)setWidth:(int)newWidth;
Вы не говорите, какой код работает, или что вы ожидаете от "работы".
Приведенный выше интерфейс создаст простые методы доступа для ширины и высоты, которые можно вызывать из других объектов как [object setWidth: 1];
или object.width = 1;
- эти два аналогичны.
Происхождение - это какой-то другой тип объекта и это указатель, да. Но вы все равно захотите объявить свойство для создания методов доступа.