序言:上一篇文章,我小结了一下Method override for the designated initializer of the superclass '-init' not found警告引发的“学案”,这次在简单小结一下Convenience initializer missing a 'self' call to another initializer编译器警告。
- 同样用上一篇文章的代码来说明:
//FileRepresentation.h
@interface FileRepresentation : NSObject
@property (nonatomic, strong) NSURL *url;
-(instancetype)initWithUrl:(NSURL*)url NS_DESIGNATED_INITIALIZER;
@end
//FileRepresentation.m
@implementation FileRepresentation
-(instancetype)init //警告Convenience initializer missing a 'self' call to another initializer
{
if (self = [super init]) { //警告Convenience initializer should not invoke an initializer on 'super'
//other code
}
return self;
}
-(instancetype)initWithUrl:(NSURL *)url
{
if (self = [super init]) {
_url = url;
}
return self;
}
@end
- 分析:因为该子类已经指定了-(instancetype)initWithUrl:(NSURL *)url为DESIGNATED_INITIALIZER,所以继承来的-(instancetype)init方法就成了Convenience initializer。
当我们标记一个初始化方法为DESIGNATED_INITIALIZER,其他方法就看作是Convenience initializer方法,另外Convenience initializer方法需要调用其他initializer,并且初始化方法调用链必须以DESIGNATED_INITIALIZER结束。这就容易理解上面两个警告了。 - 解决方法:在第二个警告处调用该子类新定义的DESIGNATED_INITIALIZER,这样既解决了第一个警告需要调用 another initializer “-(instancetype)initWithUrl:(NSURL *)url”,也解决了第二个警告不可调用 an initializer on 'super'。代码如下:
@implementation FileRepresentation
-(instancetype)init
{
if (self = [self initWithUrl:nil]) {
}
return self;
}
-(instancetype)initWithUrl:(NSURL *)url
{
if (self = [super init]) {
_url = url;
}
return self;
}
@end
- 当然了,这里也可以用diagnostic push-pop让编译器不报警告,就不累述了。
网友评论