是否可以使用便捷初始化程序覆盖指定的初始值设定项?

时间:2015-07-09 14:47:55

标签: ios

有人希望覆盖UITableViewController指定的初始值设定项- (instancetype)initWithStyle:(UITableViewStyle)style。他添加了以下代码:

- (instancetype)initWithStyle:(UITableViewStyle)style {
    self = [self init];

    return self;
}

并获得2个警告:

  1. 指定的初始值设定项只应在“超级”
  2. 上调用指定的初始值设定项
  3. 指定的初始值设定项缺少对超类的指定初始值设定项的“超级”调用
  4. 这样做可能是一种不好的做法。但是,是否可以使用便利初始化程序覆盖指定的初始化程序而不会发出警告?

    谢谢!

1 个答案:

答案 0 :(得分:0)

这是可能的,但是为了不获得编译器警告,必须满足几个条件。必须覆盖子类的所有指定初始化程序,并使用 NS_DESIGNATED_INITIALIZER 宏标记 init .. 方法将被视为指定的初始化程序。

以下是 UITableViewController 的子类 -

<强>·H

- (instancetype)initWithStyle:(UITableViewStyle)style;// this is no longer a designated initialiser

- (instancetype)init NS_DESIGNATED_INITIALIZER;

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;

- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;

<强>的.m

- (instancetype)initWithStyle:(UITableViewStyle)style {
//.. no longer treated as designated initialiser
self = [self init];

return self;
}

- (instancetype)init {
    if (self = [super initWithStyle:UITableViewStylePlain]) {
        //.. this is now treated as designated initialiser
    }
    return self;
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        //.. must implement
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        //.. must implement
    }
    return self;
}

在对象初始化下的Adopting Modern Objective-C中可以找到其他信息。