假设我有一个基类,其init被声明为NS_UNAVAILABLE:
@interface MyBase : NSObject
-(instancetype)init NS_UNAVAILEBLE;
@end
和派生类(我们称之为MyDerived)在.m中尝试实现该init(假设该方法实际上不可用):
@implementation MyDerived
-(instancetype)init {
self = [super init];
if(self){
}
return self;
}
即使在父类中调用的init被标记为NS_UNAVAILABLE,仍然不会抛出任何警告或错误,并且代码编译正常。
但是,如果我们在派生类.h中声明init:
@interface MyDerived : MyBase
-(instancetype)init;
@end
然后会显示错误!
这是预期的行为,如果它背后的原因是什么?
答案 0 :(得分:0)
桥接到Swift时使用NS_UNAVAILABLE
宏。对于构造函数和一般的方法调用,Swift要严格得多,并且它不允许调用用这个宏标记的方法。另一方面,Objective-C将允许您调用一个甚至不存在的方法。
此外,宏意味着该方法对该类的用户不可用,而不是该类本身。这就是为什么调用[super init]
有效,但公开宣布它不会。