Objective-c在init方法中使用父属性

时间:2012-07-12 18:04:13

标签: objective-c inheritance properties

我读到使用init方法中的属性被认为是不好的做法。但我应该使用父类专业吗?

例如

-(id) init
{
    if (self = [super init])
    {
        self.parentProp = someVal; // (1)
        parentProp = someVal; // (2)
    }

    return self;
}

什么是首选(1或2)以及为什么?谢谢!

2 个答案:

答案 0 :(得分:3)

在调用super的init方法之后,它已经返回,对象的超类的一部分被初始化并准备好使用。这是正常的,并且预计在此之后您将使用其属性访问器。例如。如果您创建UIViewController的子类,那么在您的init方法中设置(继承的)title属性或修改navigationItem是正常的。

那就是说,你可以打破这种行为。如果你重写了一个超类的方法(包括其中一个访问器方法),然后在init方法中调用该方法,那么在你的对象完全初始化之前,要确保你的重写方法能够正常运行。

更巧妙的是,也许你已经覆盖了一个超类方法,然后你调用了一个你没有覆盖的不同超类方法。那么,如果您调用的方法转过来并调用覆盖的方法,该怎么办?你也需要意识到这种可能性。

所有这一切,我重申,在通过调用其中一个init方法初始化它之后,使用超类的属性访问器来定制它是完全正常的。

答案 1 :(得分:1)

回答你的问题 - 他们都不是。

  1. (2)不是属性访问,而是直接实例变量访问。这取决于类层次结构设计,但总的来说,我强烈反对在非私有接口中使用ivars - 有关详细信息,请参阅this answer to related question
  2. 一般情况下,不应在类初始值设定项中使用任何类公共方法(包括属性访问)(在dealloc中) - 如果类层次结构不禁止明确地继承子类。因为如果你这样做 - 覆盖这些方法(或属性访问器)的子类将在处于无效状态时调用它们(尚未初始化或已经解除分配)。
  3. 虽然我遇到了一般由pt.2引起的一些问题,但忽略它似乎是一种常见的做法(即在初始化程序中使用自/父类属性)。所以我会说这取决于你。在类初始化程序之外编写更多用于显式设置的代码,并确信您永远不会遇到此问题。或者可能有更简单/简短的初始化和更容易使用你的课程,但要留意这个问题。