调用-initWithFrame:在超类上

时间:2011-02-19 19:11:27

标签: iphone cocoa-touch ios uiview

有人可以帮助我理解为什么我们在初始化之前首先在super上调用初始化方法。我在UIView的子类中遇到了一段代码,并想知道myMethod总是被调用,这意味着我没有在UIView中获取框架集,那么为什么我们这样做并使用{{ 1}}条件。

if

2 个答案:

答案 0 :(得分:3)

假设我有一个名为UIView的{​​{1}}子类。创建SpinningView的代码如下所示:

spinningView

现在让我们来看看SpinningView的SpinningView *spinner = [[SpinningView alloc] initWithFrame:CGRectMake(0.0, 0.0, 20.0, 20.0)]方法

的实现
-initWithFrame:

第一行是简单的作业。我们将自己分配给- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; } return self; } 实施UIView

的结果

我们使用if语句来查看self是否有效。如果不是我们就回来吧。如果是,我们配置它。

答案 1 :(得分:2)

这只是调用超类的构造函数(在本例中为UIView)。

您需要调用UIView的构造函数来确保您从子类中看不到的所有变量都已正确设置,这就是您使用[super init](或者在本例中为initWithFrame :)所做的事情。 / p>

还有其他几个原因可供选择。

首先[super init]可能会返回nil。也许在初始化超类代码中的东西时出错了。检查self != nil可确保在对象已出现问题时不使用该对象。它甚至可能已被超级构造函数释放。

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

总结:

  1. 始终调用指定的构造函数(即init-method)。
  2. 始终使用if ((self = [super init])) { /* own init */ } return self;
  3. 的标准构造
  4. 有时它看起来不同,但只是出于特殊原因。如有疑问,请务必使用(2)。
  5. Apple的文档中有更多关于此的信息,您是否感兴趣。

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