2009-11-10 79 views
0

我只是想确保我正确地做事情,因为我前进与Objective-C,如果我可能会提出两个快速问题:设置嵌套对象?

(1)我正在从Rectangle中正确访问Position对象吗?我是否有权访问我在init中设置的指针所包含的Position对象,还是有更好的方法?

(2)In [setPosX:andPosY:]设置Position实例变量的两种方式中的哪一种最好,或者它真的没有关系?

// INTERFACE 
@interface Position: NSObject { 
    int posX; 
    int posY; 
} 
@property(assign) int posX; 
@property(assign) int posY; 
@end 

@interface Rectangle : NSObject { 
    Position *coord; 
} 
-(void) setPosX:(int) inPosX andPosY:(int) inPosY; 

// IMPLEMENTATION 
@implementation Rectangle 
-(id) init { 
    self = [super init]; 
    if (self) { 
     NSLog(@"_init: %@", self); 
     coord = [[Position alloc] init]; 
     // Released in dealloc (not shown) 
    } 
    return(self); 
} 
-(void) setPosX:(int) inPosX andPosY:(int) inPosY { 
    //[coord setPosX:inPosX]; 
    //[coord setPosY:inPosY]; 
    coord.posX = inPosX; 
    coord.posY = inPosY; 
} 

EDIT_01

不要我再调用 - (ID)initWithX:安迪:从矩形对象时我初始化呢?如果是的话,我怎么去设置main()中的posX和posY?或者我用另一个 - (id)initWithX:和Y替换矩形的init:并将值传递给?

@implementation Rectangle 
-(id) init { 
    self = [super init]; 
    if (self) { 
     NSLog(@"_init: %@", self); 
     coord = [[Position alloc] initWithX:1234 andY:5678]; 
    } 
    return(self); 
} 
... 

欢呼加里

回答

2

(1)您正确访问它。

(2)在objective-c 2.0中,作业具有相同的效果。

设计明智的,你想使:

-(void) setPosX:(int) inPosX andPosY:(int) inPosY; 

...入位的方法。这将数据和与之相关的方法封装到一个对象中。所以,你可以有一个像电话:

coord = [[Position alloc] initWithX:inPosX andY:inPosY]; 

或 [坐标setPosX:inPosX andPosY:inPosY]。

所有更清洁和更容易维护。


编辑O1

不要我再调用 - (ID)initWithX:安迪: 从矩形对象时我初始化 呢?

这取决于你的设计。如果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初始化:

-(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]; 

或者你可以写为矩形另一个组合初始化:

-(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为您设置初始化程序提供了很大的灵活性,因此您可以创建任何您觉得方便的初始化程序。

您通常希望避免使用实际功能而不是类内的方法。

1

(1)您还需要释放它-dealloc。创建一个未初始化位置的Rectangle是否真的有意义?换句话说,[[Position alloc] init]的行为是什么,矩形在该状态下应该有一个位置是否合理?

(2)他们都做同样的事情。你写的那个比你所评论的更清楚,因为它表明你正在改变属性而不是让对象去做某件事。无论如何,这是我的看法。有些人同意,其他人不同意,正如我所说的,行为是一样的。