在指定的初始化程序中初始化实例对象?

时间:2012-08-02 23:19:56

标签: objective-c object inheritance designated-initializer

我有一个Rectangle类,它具有属性width和height。它还有一个名为 origin ( - (XYPoint *)origin)的实例属性/对象。下面是我指定的初始化程序的代码,我在其中传递XYPoint对象作为参数。如果我将XYPoint类的属性作为此方法中的参数,然后初始化XYPoint对象以及在方法内为它分配内存,有没有办法(或者没关系)?否则,我必须在我的主程序中创建一个XYPoint对象,并将其作为参数传递,这是要输入的更多代码。

-(id) initWithWidth:(int)w andHeight:(int)h andOrigin:(XYPoint *)o
{
    self = [super init];
    if (self) {
        [self setWidth: w andHeight: h];
        self.origin = o;
    }
    return self;
}

P.S.-我是编程和Objective C的新手,请原谅我,如果我在我的问题中说了一些技术错误的东西。谢谢!

1 个答案:

答案 0 :(得分:0)

个人 - 我试图避免使用参数的初始化器。我认为这会导致编写更多代码和缺乏灵活性。我只使用指定的初始化器来做两件事:

  • 初始化具有在初始化对象后不得更改的属性的对象
  • 使用构造它所必需的属性初始化对象,以后不能指定

一般来说,对于Rectangle类,我会这样使用:

Rectangle * r = [ [ Rectangle alloc ] init ] ;
r.x = x ;
r.y = y ;
r.origin = o ;

// use r

除了上述条件外,根本不使用指定的初始化模式。 (例如,创建不可变的Rectangle实例)

最后,可能没有必要创建一个Rectangle类 - 只需使用CGRect / NSRect原语结构。