重新定义由父类声明为 NS_UNAVAILABLE 的初始化程序

And*_*lli 5 initialization objective-c

我想重新定义一个先前NS_UNAVAILABLE由父类声明的初始化程序。

如:

@interface Parent : NSObject

// Unavailable
- (instancetype)init NS_UNAVAILABLE;

// Some other (appropriate) initialiser
- (instancetype)initWithWhatever:(id)whatever NS_DESIGNATED_INITIALIZER;

@end
Run Code Online (Sandbox Code Playgroud)

对子初始化程序的任何调用都需要传播到父级的指定初始化程序,这是有道理的。

假设默认参数对子类有意义,因此:

@interface Child : Parent

// Propagates to initWithWhatever:
- (instancetype)init NS_DESIGNATED_INITIALIZER;

@end
Run Code Online (Sandbox Code Playgroud)

即使初始化器被子类重新声明,Xcode 似乎仍然认为它不可用。有没有解决的办法?

Sil*_*ril 0

看起来这个行为在Xcode 8中已修复(在 8.1 中测试)。

我还有一些注意事项:

  1. 为了使您的Child实现完全完成,您应该覆盖它initWithWhatever或使其不可用。因为当然Child会继承这个初始化器。Parent

  2. 如果您使init不可用,那么使new不可用也是有意义的。

所以。从现在开始,我们可以借助Objective-CNS_DESIGNATED_INITIALIZER中的&NS_UNAVAILABLE组合来完全控制我们的初始化器。与Swift相比,它需要更多的工作,但恕我直言,这是值得的。特别是如果你想让你的类更好地兼容 Swift。