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 似乎仍然认为它不可用。有没有解决的办法?
看起来这个行为在Xcode 8中已修复(在 8.1 中测试)。
我还有一些注意事项:
为了使您的Child实现完全完成,您应该覆盖它initWithWhatever或使其不可用。因为当然Child会继承这个初始化器。Parent
如果您使init不可用,那么使new不可用也是有意义的。
所以。从现在开始,我们可以借助Objective-CNS_DESIGNATED_INITIALIZER中的&NS_UNAVAILABLE组合来完全控制我们的初始化器。与Swift相比,它需要更多的工作,但恕我直言,这是值得的。特别是如果你想让你的类更好地兼容 Swift。