调用不同的init方法

时间:2014-08-13 15:38:53

标签: ios objective-c cocoa-touch

我对此有点了解。我通过以下方式初始化UITableViewController子类CTSettingsVC

CTSettingsVC *settingsVC = [[CTSettingsVC alloc] init];

但是,正在调用initWithStyle初始值设定项。这是我的文件:

@interface CTSettingsVC ()

@end

@implementation CTSettingsVC

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        NSLog(@"Why is this called?")
        self.title = @"Settings";
    }
    return self;
}

@end

我不确定这是否是预期的行为,或者我是否遗漏了某些内容。

2 个答案:

答案 0 :(得分:7)

这是因为initWithStyle:UITableViewController的指定初始值设定项。 init的{​​{1}}方法看起来像这样:

UITableViewController

并非所有UIKit类都遵循这个覆盖- (instancetype)init { //NOTE: self is being used instead of super return [self initWithStyle:UITableViewStylePlain]; } 的约定,其中包含指定初始值设定项的默认值。如果我计划使用init作为默认初始化程序来确保我的子类在未来版本的UIKit中不被破坏,我经常自己这样做。

答案 1 :(得分:1)

initinitWithStyle:UITableViewController的便捷初始值设定项。在内部,它们看起来像这样:

- (instancetype)init
{
    return [self initWithStyle:UITableViewStylePlain];
}

- (instancetype)initWithStyle:(UITableViewStyle)style
{
    self = [self initWithNibName:nil bundle:nil];
    if (self) {
        _tableViewStyle = style; // Private, used in loadView.
    }
    return self;
}

当您的视图控制器由故事板实例化时,您将看不到initWithNibName:bundle:被调用的异常。在那里,initWithCoder:是初始化程序。