Method override for the designated initializer of the superclass '-init' not found警告引发的“学案”

  • 我写了一个简单的类如下:

//FileRepresentation.h

@interface FileRepresentation : NSObject

@property (nonatomic, strong) NSURL *url;

-(instancetype)initWithUrl:(NSURL*)url NS_DESIGNATED_INITIALIZER;

@end

FileRepresentation.m

@implementation FileRepresentation

-(instancetype)initWithUrl:(NSURL *)url

{

    if (self = [super init]) {

        _url = url;

    }

    return self;

}

@end

这时编译器报警告:Method override for the designated initializer of the superclass '-init' not。

  • 分析:这是说因为我重新设计了DESIGNATED_INITIALIZER方法,没有沿用父类的DESIGNATED_INITIALIZER方法,所以编译器提醒需要重写父类的DESIGNATED_INITIALIZER方法。

  • 解决方法有三种:

第一种:按照警告思路,重写父类DESIGNATED_INITIALIZER方法,并且需要在重写方法中调用子类的新的DESIGNATED_INITIALIZER方法,不调用的话会报另外一个警告,我准备再写一篇短文介绍Convenience initializer missing a 'self' call to another initializer解决

具体代码如下:


@implementation FileRepresentation

//重写父类的指定初始化方法

-(instancetype)init

{

    if (self = [self initWithUrl:nil]) {

    }

    return self;

}

//新的指定初始化方法

-(instancetype)initWithUrl:(NSURL *)url

{

    if (self = [super init]) {

        _url = url;

    }

    return self;

}

@end

第二种方法:在.h接口文件中用NS_UNAVAILABLE;声明父类的DESIGNATED_INITIALIZER方法在该子类中不可用


@interface FileRepresentation : NSObject

@property (nonatomic, strong) NSURL *url;

-(instancetype)init NS_UNAVAILABLE;

-(instancetype)initWithUrl:(NSURL*)url NS_DESIGNATED_INITIALIZER;

@end

第三种方法:利用diagnostic push-pop让编译器不报警告


#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Wobjc-designated-initializers"

@implementation FileRepresentation

-(instancetype)initWithUrl:(NSURL *)url

{

    if (self = [super init]) {

        _url = url;

    }

    return self;

}

@end

#pragma clang diagnostic pop

总结:以上三种方法其实根据不同的特点适合在不同的情况下比较适应,都有优劣,在这里第二种方法更加简便。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容