需要注意的是,若为子类指定一个 NS_DESIGNATED_INITIALIZER 宏标记的初始化方法,那么在子类中必须重写父类的 designated 初始化方法,该方法的实现是调用子类自身的 designated 初始化方法。在子类自身的 designated 初始化方法的实现中,又需要调用父类的 designated 初始化方法。这段话比较绕,下面提供一个例子来说明。
// AwesomeTips.h
@interface AwesomeTips : NSObject
- (instancetype)new NS_UNAVAILABLE;
- (instancetype)initWithName:(NSString *)aName;
- (instancetype)initWithName:(NSString *)aName
wish:(NSString *)ourWish NS_DESIGNATED_INITIALIZER;
@end
// AwesomeTips.m
@interface AwesomeTips ()
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *wish;
@end
@implementation AwesomeTips
// 父类 NSObject 的 designated 方法为 init,这里必须重写,
// 否则警告“Method override for the designated initializer of the superclass '-init' not found”
// 在其重写实现中,调用子类指定的 designated 方法,并提供默认参数
- (instancetype)init {
return [self initWithName:@"iOS-Tips" wish:@"Share Knowledge"];
}
// secondary 初始化方法的实现,调用自身的 designated 方法
- (instancetype)initWithName:(NSString *)aName {
return [self initWithName:aName wish:@"Share Knowledge"];
}
// 自身的 designated 初始化方法
// 需先调用父类的 designated 方法,而后使用参数赋值
- (instancetype)initWithName:(NSString *)aName
wish:(NSString *)ourWish {
if (self = [super init]) {
self.name = aName;
self.wish = ourWish;
}
return self;
}
@end