(1) Вы обращаетесь к нему правильно.
(2) В target-c 2.0 назначения имеют одинаковый эффект.
Дизайн мудрый, вы хотели бы сделать:
-(void) setPosX:(int) inPosX andPosY:(int) inPosY;
... в метод позиции. Это инкапсулирует данные и методы, связанные с одним объектом. Таким образом, вы могли бы звонить как:
coord = [[Position alloc] initWithX:inPosX andY:inPosY];
или
[координируйте setPosX: inPosX иPosY: inPosY];
все намного чище и проще в обслуживании.
Редактировать O1
Должен ли я тогда позвонить - (id) initWithX: andY:
от объекта Rectangle, когда я инициирую
это?
Это зависит от вашего дизайна. Если свойство coord
абсолютно необходимо для экземпляра Rectangle
, то вы должны вызывать его при инициализации экземпляра Rectangle
. Вы могли бы даже написать инициализаторы для Rectangle
, которые принимают позицию или x и y в качестве ввода. например:
-(id) initWithPosition:(Position *) aPos {
self = [super init];
if (self) {
NSLog(@"_init: %@", self);
coord = aPos;
// Released in dealloc (not shown)
}
return self;
}
Вы также должны написать инициализатор connivence для класса Position:
-(id) initWithX:(NSInteger) x andY:(NSInteger) y{
self=[super init];
self.posX=x;
self.posY=y;
return self;
}
Затем вы бы позвонили как:
Position *aPos=[[Position alloc] initWithX:100 andY:50];
Rectangle *aRec=[[Rectangle alloc] initWithPosition:aPos];
Или вы можете написать другой инициализатор комбинации для Rectangle:
-(id) initWithXCoordinate:(NSInteger) x andYCoordinate:(NSInteger) y{
self=[super init];
Position *aPos=[[Position alloc] initWithX:x andY:y];
self.coord=aPos;
return self;
}
и назовите это как:
Rectangle *aRec=[[Rectangle alloc] initWithXCoordinate:100
andYCoordinate:50];
Это грубые примеры, но вы поняли идею. Objective-c дает вам большую гибкость в настройке инициализатора, поэтому вы можете создавать любые инициализаторы, которые вы считаете удобными.
Как правило, вы хотите избежать использования реальных функций вместо методов внутри классов.