使用指定的初始化程序初始化类 - 混淆

时间:2013-07-29 08:39:07

标签: objective-c cocoa-touch

我正在读一本教导我们应该实现类的指定初始化器的书,然后让其他初始化器调用这个(我同意)。

现在,我在本书的一节中说:“UITableViewController的指定初始化程序是initWithStyle:”。然后进入这样的实现:

// inside ItemsViewController.m, subclass of UITableViewController

-(id) init{
    // Call the superclass's designated initializer
    self = [super initWithStyle:UITableViewStyleGrouped];
    if (self) {

    }
    return self;
}

- (id)initWithStyle:(UITableViewStyle)style
{
    return [self init];
}

在这段代码之后,本书还说:“这将确保ItemsViewController的所有实例都使用UITableViewStyleGrouped样式,无论发送给它的初始化消息是什么。”

为了坚持我在帖子开头描述的原则,我可能会像这样实现这个类:

// inside ItemsViewController.m, subclass of UITableViewController


// Implement the designated initializer first
-(id) initWithStyle:(UITableViewStyle)style
    // Call the superclass's designated initializer
    self = [super initWithStyle:UITableViewStyleGrouped];
    if (self) {

    }
    return self;
}

// Call designated initializer
- (id)init
{
    return [self initWithStyle: nil];
}

但我觉得我错过了什么?我认为这本书在他们的案例中使用init作为指定的初始化程序?

3 个答案:

答案 0 :(得分:0)

如果你有自定义tableviewcell类,那么你不需要实现initwithstyle初始化程序,并且不会为原始和类成员对象调用initialilzer。你将不得不受苦。所以遵循标准初始化。

答案 1 :(得分:0)

构建

// Implement the designated initializer first
-(id) initWithStyle:(UITableViewStyle)style
    // Call the superclass's designated initializer
    self = [super initWithStyle:UITableViewStyleGrouped];
    if (self) {

    }
    return self; }

对于类的用户来说很困惑,因为他会认为你提供了initWithStyle构造函数来允许他设置控制器的样式。你应该使用你的第一个init方法。

答案 2 :(得分:0)

基本上你的代码和书中的代码都做同样的事情。类有不同类型的初始值设定项,您可以使用所需的类型。本书中的示例想要向您展示如何在以后需要一些自定义初始化程序时覆盖它们。播下它是可以理解的,从真实的实时应用程序的角度来看它实际上没有意义,但从学习覆盖初始化器和定制我觉得没问题。