对于初始化程序,我可以发现我发现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_INITIALIZER
和NS_UNAVAILABLE
组合完全控制初始化程序。与 Swift 相比,它需要做更多的工作,但是恕我直言,这是值得的。特别是如果您想使您的类与Swift更好地兼容。关于objective-c - 重新定义由父类声明为NS_UNAVAILABLE的初始化程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31887675/