0

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

它的代码是什么样的?

在下面的这段代码中,哪个代码行是指定的初始值设定项?

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

谢谢你。

4

2 回答 2

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

所以要在子类中改变类的初始化行为,只需要改变指定的初始化器,其他的就免费了。

于 2013-04-10T22:44:53.953 回答
2

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

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

指定的初始化器可以有多个,具体取决于特定的类。为了找到那些,您需要检查文档。

例如UIView有两个指定的初始化器

  • -initWithFrame:
  • -initWithCoder:

并且您必须在自定义UIView子类中可能拥有的任何其他初始化程序中调用两者之一。

有关更多详细信息,请参阅多个初始化器和指定初始化器(感谢 Seamus)

于 2013-04-10T22:33:56.697 回答