在超类上调用-initWithFrame:
有人可以帮助我理解,为什么我们在初始化之前先调用super
方法的初始化方法。 我遇到了UIView子类中的一段代码,并想知道在这里myMethod总是被调用,这意味着我没有得到在UIView
框架集,那么为什么我们这样做,并使用if
条件。
self = [super initWithFrame:CGRectMake(0, 0, 20, 100)]; if(self != nil) { [self myMethod:data]; self.backgroundColor = [UIColor clearColor]; } return self;
比方说,我有一个名为SpinningView
的UIView
子类。 创buildspinningView
的代码如下所示:
SpinningView *spinner = [[SpinningView alloc] initWithFrame:CGRectMake(0.0, 0.0, 20.0, 20.0)]
现在我们来看看SpinningView的-initWithFrame:
方法的实现
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; } return self; }
第一行是简单的分配。 我们将自己分配给UIView
的-initWithFrame:
实现的结果-initWithFrame:
我们使用if语句来判断self是否有效。 如果不是,我们就把它退回去。 如果是,我们configuration它。
这只是简单地调用超类的构造函数(在本例中为UIView)。
你需要调用UIView的构造函数来确保你没有从你的子类中看到的所有variables设置正确,这就是你使用[super init]
(或者在这种情况下是initWithFrame :)所做的。
还有其他几个原因,看起来像这样。
首先[super init]
可能会返回零。 初始化超类的代码中的东西可能出了问题。 self != nil
检查self != nil
确保在对象已经有错误的情况下不使用该对象。 它甚至可能被超级构造函数释放。
在其他情况下,超级构造函数可能实际上完全返回一个不同的对象。 这种情况的例子是类集群或者当你实现一个单例。
总结:
- 总是调用指定的构造函数(即init-method)。
- 总是使用
if ((self = [super init])) { /* own init */ } return self;
的标准构造if ((self = [super init])) { /* own init */ } return self;
- 有时看起来不同,但只是由于特殊的原因。 如果有疑问,请使用(2)。
苹果的文档有更多的信息,这是你有兴趣。
另外,当重写这样的构造函数时,请记住可能有多个构造函数。 例如,如果使用Interface Builder添加视图,那么将使用“initWithCoder:”来初始化该视图。 所有的构造函数都以“init”开始。