指定初始化程序的代码是什么样的?

时间:2013-04-10 22:29:29

标签: objective-c

我已经查看了有关init和初始化程序概念的书籍和多篇论坛帖子,但我仍然无法理解指定的初始化程序。

它的代码是什么样的?

在下面的代码中,哪个代码行是指定的初始化程序?

-( Fraction *) initWith (int) n over: (int) d
{
    self  = [ super init];
    if (self) 
        [self setTo: n over: d ];
    return self; 
} 

谢谢。

2 个答案:

答案 0 :(得分:4)

你对“指定初始值设定项”的含义有点困惑。一堂课可能有几个初学者。我们来看一个虚构的Cat课程。它可能有以下初始值设定项:

- init
- initWithName:
- initWithName:breed:
- initWithName:breed:age:

指定的初始值设定项实际执行该类的初始化并调用super。最后一个,initWithName:breed:age可能是指定的初始化程序,因为它获取的数据最多。它可以像这样实现:

- (id)initWithName:(NSString *)name breed:(CatBreed)breed age:(NSUInteger)age {
    if (self = [super init]) {
        _name = [name copy];
        _breed = breed;
        _age = age;
    }
    return self;
}

这可以完成设置实例的所有工作。其他初始化器将根据这个实现。例如,另一个可能是这样实现的:

- (id)initWithName:(NSString *)name {
    return [self initWithName:name breed:CatBreedTabby age:0];
}

因此,要在子类中更改类的初始化行为,只需更改指定的初始化程序,即可免费获取其他初始化程序。

答案 1 :(得分:2)

每个初始化程序必须在其实现中调用指定的初始化程序。

在这种情况下,[super init]调用是对类的超类初始化程序的调用,因此这可能是设计的初始化程序本身。

指定的初始值设定项可以不止一个,具体取决于具体的类。为了找到那些,你需要查看文档。

例如UIView有两个指定的初始值设定项

  • -initWithFrame:
  • -initWithCoder:

并且您必须在自定义UIView子类中的任何其他初始化程序中调用其中一个。

有关详细信息,请参阅Multiple Initializers and the Designated Initializer(感谢Seamus)