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

时间:2015-08-07 22:44:08

标签: objective-c 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

对儿童初始化者的任何调用都需要传播到父指定的初始化者是有意义的。让我们说默认参数在子类上是有意义的,因此:

@interface Child : Parent

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

@end

即使初始化程序被子类重新声明,xcode似乎仍然认为它不可用。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

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

我也有一些注意事项:

  1. 要使Artist实施完全完成,您应该覆盖Child或使其不可用。因为initWithWhatever当然会从Child继承此初始值设定项。

  2. 如果您Parent无效,则init也不可用。

  3. 因此。从现在起,我们可以在new&帮助下完全控制我们的初始值设定项。 Objective-C 中的NS_DESIGNATED_INITIALIZER组合。与 Swift 相比,它需要更多的工作,但这是值得的。特别是如果你想让你的课程与Swift更好地兼容。