请注意,在某些情况下,您的类可以同时支持两个初始值设定项 . 在这种情况下,只需重新声明 @interface 's designated initializers. This is sufficient to document a designated initializer. Either that, or document an initializer or set of initializers as designated initializers, which would logically invalidate any superclass'指定的初始值设定项 .
当然,初始化程序应该在其初始化时调用其中一个超类'指定的初始值设定项 .
第Ex.I:
// implicitly adds a designated initializer. -init is still valid:
@interface MONObject : NSObject
- (instancetype)initWithString:(NSString *)pString;
@end
例2:
// redefines the designated initializer. -init is not valid:
@interface MONObject : NSObject
// MONObject's designated initializer
- (instancetype)initWithString:(NSString *)pString;
@end
4 回答
@justin基本上就是重点 .
Objective-C中的方法是遗传的 . 这意味着如果超类具有初始化方法(初始化器只是方法),并且您的子类没有覆盖它,那么您的子类将继承该超类的初始化方法 . 这意味着人们总是可以在子类的对象上调用超类的初始化器(继承和子类型多态的基本结果) . 但这可能不是你所期望的 . 超类的初始化程序可能无法完成您的类所需的所有初始化 .
这就是为什么你应该覆盖超类的初始化器 . 如果您不希望人们在您的类的对象上使用该初始化程序,则应该在该初始化程序中引发异常 . 否则,您应该覆盖它以对您的类进行任何适当的初始化 .
就个人而言,我认为这是一个糟糕的指导方针 . 当你指定了一个更严格的指定初始化器(例如引入参数的初始化器)时,实现超类'指定的初始化器(做任何有意义的事情)是不合逻辑的 .
例如,
-initWithDomain:code:userInfo:
是NSError
的指定初始值设定项;[[NSError alloc] init]
可以返回一个合理的描述性错误吗?如果有的话,私下覆盖'已删除'的初始化程序并将其视为程序员错误来调用,但不要假装客户端可以使用除指定的初始化程序之外的初始化程序 .
请注意,在某些情况下,您的类可以同时支持两个初始值设定项 . 在这种情况下,只需重新声明
@interface
's designated initializers. This is sufficient to document a designated initializer. Either that, or document an initializer or set of initializers as designated initializers, which would logically invalidate any superclass'指定的初始值设定项 .当然,初始化程序应该在其初始化时调用其中一个超类'指定的初始值设定项 .
第Ex.I:
例2:
例3:
EDIT
问题在评论中澄清 .
当您简单地覆盖超类声明的初始化程序时:
Unless your class has initialization to perform, you do not need to explicitly override the superclass' designated initializer.
您的实例将被初始化为具有归零内存 .
鉴于:
它基本上是说如果一个类有
iniWithSomethingDomething
,那么最好做一个在你自己的初始化程序中
我理解它,如果你的类有一个指定的init,你想要覆盖超级init,所以它调用你指定的init .
在你的实现中有点像这样 .
做你的指定初始化
然后在覆盖超级时调用它