我感觉很愚蠢,但是......在自定义类型中初始化实例变量的正确方法是什么,派生自 Cocoa Touch UI 类?
假设我有类型,源自UIViewController
,让它成为TRUIController
。我定义了一个 ivar,如下所示:
@implementation TRUIController
{
NSNumberFormatter *_numberFormatter;
}
@end
我应该把_numberFormatter
初始化代码放在哪里,如果我希望它在任何 UI 方法之前执行viewDidLoad
,等等?
在其他语言中,我会创建constructor
、调用base
constructor
然后初始化我的 ivars。但这根本不适用于objective-c
and Cocoa Touch
。
在上述情况下,如果我写
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibBundleOrNil bundle:nibBundleOrNil];
if(self)
{
//init ivars
}
return self;
}
不行,我再试试别的initWithBlaBla
方法,最后find init
,其实就是调用的,那样的话——initWithCoder:
现在,假设我有从 UITableViewCell 派生的类。同样,需要初始化NSNumberFormatter
ivar。为什么我不能只覆盖init:
、调用super
和初始化我的 ivars?
这个奇怪的设计决定背后的想法是什么?没有为所有类型提供单一的通用初始化方法?
它是在派生类型中初始化 ivars 的唯一方法吗?每次都做一些研究来弄清楚这次覆盖什么方法?
我错过了什么吗?因为感觉非常愚蠢/不直观/容易出错