- 我写了一个简单的类如下:
//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
总结:以上三种方法其实根据不同的特点适合在不同的情况下比较适应,都有优劣,在这里第二种方法更加简便。