代码之家  ›  专栏  ›  技术社区  ›  Andrew Grant

三个Objective-C构造器问题

  •  3
  • Andrew Grant  · 技术社区  · 15 年前

    • [super init]是否需要一直执行到NSObject(e、 g如果Foo从NSObject继承,那么Foo是否应该调用[super init]?如果不是,这对dealloc也适用吗?
    • 对象中的成员变量是否发生任何形式的默认初始化。例如,NSString*成员是否会被初始化为nil?浮动到0.0?

    谢谢

    4 回复  |  直到 15 年前
        1
  •  6
  •   philsquared    15 年前

    我只想在前面的三个答复中再补充一点:

    1. 是的。在实践中 NSObject init 你应该尽快打电话。

    2. 绝对地记住init,否则任何变体都只是一个普通的方法。它只是一个初始化器 依照惯例 designated initializer “让所有其他的初始化者来调用这个。考虑一下你的第一个问题。如果你是子类,你的子类会调用什么?默认情况下,子类作者将调用 -所以,如果你有一个不同的初始值设定项,那么很重要的一点是,你要弄清楚,这样子类的作者知道如何调用它。

    你可以阅读更多(权威的)细节 here in the Apple docs

        2
  •  2
  •   Rob Keniger    15 年前

    您总是需要调用超类的初始化方法并赋值 self 结果呢。你也一定要打电话 super 的实现 -dealloc

    默认情况下,所有实例变量都初始化为0/nil,这是可以保证的。

    是的,你可以打电话 [self init] 从更具体的初始化方法:

    - (id)initFoo
    {
        self=[self init];
        if(self)
        {
           //do stuff
        }
        return self;
    }
    
        3
  •  0
  •   cobbal    15 年前
    1. 是的 init (技术上不需要,但最佳实践)对于 dealloc
    2. 是的,所有内存都初始化为 0 哪个是 nil , 0.0
    3. 是的,这很常见
        4
  •  0
  •   Chris Becke    15 年前
    • 不知道。

    • 对创建任何你想要的初始化方法。记录下来。但是一定要调用super的正确init方法:不管它是什么。