gpt4 book ai didi

ios - 是否可以使用便捷初始化程序覆盖指定的初始化程序?

转载 作者:行者123 更新时间:2023-12-01 16:31:49 24 4
gpt4 key购买 nike

有人想重写UITableViewController指定的初始化程序- (instancetype)initWithStyle:(UITableViewStyle)style。他添加了以下代码:

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

return self;
}

并收到2条警告:
  • 指定的初始化程序仅应在“super”上调用一个指定的初始化程序
  • 指定的初始化程序缺少对 super 类
  • 的指定初始化程序的“ super ”调用

    这样做可能是一个不好的做法。但是,是否可以在不发出警告的情况下使用便捷初始化程序覆盖指定的初始化程序?

    谢谢!

    最佳答案

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

    以下是 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中的“对象初始化”下找到。

    关于ios - 是否可以使用便捷初始化程序覆盖指定的初始化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31320946/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com