调用标记为NS_UNAVAILABLE的方法时未显示错误

时间:2017-06-15 03:04:53

标签: ios objective-c xcode

假设我有一个基类,其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

然后会显示错误!

这是预期的行为,如果它背后的原因是什么?

1 个答案:

答案 0 :(得分:0)

桥接到Swift时使用NS_UNAVAILABLE宏。对于构造函数和一般的方法调用,Swift要严格得多,并且它不允许调用用这个宏标记的方法。另一方面,Objective-C将允许您调用一个甚至不存在的方法。

此外,宏意味着该方法对该类的用户不可用,而不是该类本身。这就是为什么调用[super init]有效,但公开宣布它不会。