我有一个 UIViewContoller
子类 BaseViewControler
。它有一个名为 -initWithStyle:
的方法。如果我将 that 类子类化为 SubBaseViewContoller
,
-[SubBaseViewController init]
应该是什么样子?
我的代码:
- (id)init
{
self = [self initWithStyle:kGreenStyle];
if (self) {
// stuff
}
return self;
}
在 SubBaseViewController
我没有 initWithStyle:
并且我的应用程序使用上面的 -init
随机崩溃,我检查了其他 View Controller ,它们是 BaseViewController
的子类,它们使用 self = [super initWithStyle:kGreenStyle]
,并开始工作。怎么解释?
最佳答案
UIViewController
有两个指定的初始化器:
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle;
和
- (instancetype)initWithCoder:(NSCoder *)aDecoder;
当使用 Interface Builder 定义带有资源的 View Controller 时,将调用第二种形式,即 nib 文件或 segues。当您手动创建 View Controller 时,可以使用第一种形式。
您可以按如下方式覆盖这些初始化器:
// Designated initializer
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
{
self = [super initWithNibName:nibName bundle:nibBundle];
if (self) {
; // your initialization
}
return self;
}
// Designated initializer
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
; // your initialization
}
return self;
}
注意:init
方法在从资源创建时不会被调用。当您自己调用 init
时,它最终会使用 nil
参数调用 initWithNibName:bundle:
。
另请参阅:引用:Multiple Initializers and the Designated Initializer
您的问题的另一种可能的解决方案:
提供初始化自定义 View Controller 的方法的一种方法是使用“便利类方法”。在这种情况下,您不需要重写指定的初始值设定项,而是在您的子类中提供属性。
便利类方法可能如下所示:
// MyViewController
+ (instancetype) myViewControllerWithStyle:(Style)style
{
// Possibly get the bundle and the nib name (or leave it nil)
...
// Invoke a designated initializer with suitable parameters:
MyViewController* viewController = [[MyViewController alloc] initWithName:nibName
bundle:bundle];
viewController.style = style;
return viewController;
}
关于ios - self init .. 与 super init ... 在子类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22528358/