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

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

你可能感兴趣的:(Method override for the designated initializer of the superclass '-init' not found警告引发的“学案”)