我感觉很愚蠢,但是......在自定义类型中初始化实例变量的正确方法是什么,派生自 Cocoa Touch UI 类?
假设我有类型,源自UIViewController,让它成为TRUIController。我定义了一个 ivar,如下所示:
@implementation TRUIController
{
NSNumberFormatter *_numberFormatter;
}
@end
我应该把_numberFormatter初始化代码放在哪里,如果我希望它在任何 UI 方法之前执行viewDidLoad,等等?
在其他语言中,我会创建constructor、调用base constructor然后初始化我的 ivars。但这根本不适用于objective-cand 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 派生的类。同样,需要初始化NSNumberFormatterivar。为什么我不能只覆盖init:、调用super和初始化我的 ivars?
这个奇怪的设计决定背后的想法是什么?没有为所有类型提供单一的通用初始化方法?
它是在派生类型中初始化 ivars 的唯一方法吗?每次都做一些研究来弄清楚这次覆盖什么方法?
我错过了什么吗?因为感觉非常愚蠢/不直观/容易出错