对于初始化程序,我可以发现我发现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似乎仍然认为它不可用。有没有解决的办法?

最佳答案

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

我也有一些注意事项:

  • 要完全完成Child的实现,您应该覆盖initWithWhatever或使其不可用。因为Child当然将从Parent继承此初始化程序。
  • 如果您使init不可用,那么也使new不可用也是合理的。

  • 所以。从现在开始,我们可以使用 Objective-C 中的NS_DESIGNATED_INITIALIZERNS_UNAVAILABLE组合完全控制初始化程序。与 Swift 相比,它需要做更多的工作,但是恕我直言,这是值得的。特别是如果您想使您的类与Swift更好地兼容。

    关于objective-c - 重新定义由父类声明为NS_UNAVAILABLE的初始化程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31887675/

    10-10 20:47