在超类上调用-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; 

比方说,我有一个名为SpinningViewUIView子类。 创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确保在对象已经有错误的情况下不使用该对象。 它甚至可能被超级构造函数释放。

在其他情况下,超级构造函数可能实际上完全返回一个不同的对象。 这种情况的例子是类集群或者当你实现一个单例。

总结:

  1. 总是调用指定的构造函数(即init-method)。
  2. 总是使用if ((self = [super init])) { /* own init */ } return self;的标准构造if ((self = [super init])) { /* own init */ } return self;
  3. 有时看起来不同,但只是由于特殊的原因。 如果有疑问,请使用(2)。

苹果的文档有更多的信息,这是你有兴趣。

另外,当重写这样的构造函数时,请记住可能有多个构造函数。 例如,如果使用Interface Builder添加视图,那么将使用“initWithCoder:”来初始化该视图。 所有的构造函数都以“init”开始。