【问题标题】:Objective-C: init vs initializeObjective-C:初始化与初始化
【发布时间】:2011-05-31 17:52:06
【问题描述】:

在 Objective-C 中,init 方法(即类的指定初始化程序)和initialize 方法有什么区别?每个应该放什么初始化代码?

【问题讨论】:

    标签: objective-c initialization init initializer


    【解决方案1】:

    -init是一个实例方法,用来初始化一个特定的对象。 +initialize 是一个类方法,在创建该类的任何实例之前以及运行其他类方法之前运行。 +initialize 不是您大部分时间使用的东西,但它可以方便地设置整个类可能使用的任何静态变量,或者确保在创建任何实例之前满足某些条件。

    -init 方法中的代码在The Objective-C Programming LanguageImplementing an Initializer 部分进行了详细描述。还有一些关于初始化类(即+initialize)的讨论,以及为什么您可能需要在同一文档中的Class Objects 部分中这样做。进入+initialize 的代码通常与类的特殊功能紧密相关,需要您首先对其进行初始化。在+initialize(以及任何类方法中)中要记住的重要一点是,类方法中的self 指的是类本身,而不是类的实例。

    【讨论】:

    • “在创建类的任何实例之前运行”并不是真的:发送在该类收到它的第一条消息之前 (不包括+initialize 方法)。实际上,您可以在不向该类发送消息的情况下创建一个类的实例(使用它的 create-instance 方法的IMP(通常是+allocWithZone:,但这可能会有所不同)。
    • @WTP,公平点,但如果你在那个领域工作,你可能已经很清楚 +initialize 和 -init 之间的区别了。
    • 我通常在+initialize方法中看到if (self == [NameOfClass class]),为什么我们需要检查呢?我知道这与 +initialize 方法在父类上被调用两次有关,但我不清楚。任何帮助表示赞赏!
    • @makaed 你的问题在docs 中得到了很好的回答——下面是相关行:如果子类没有实现初始化,超类实现可能会被多次调用——运行时会调用继承的实现... 因此,即使 +initialize 每个类只调用一次,单个实现也可能会被调用多次——一次用于它所在的类,一次用于每个不提供的子类它是自己的+initialize 方法。
    • 啊,谢谢!现在这是有道理的。我还创建了一个question 并得到了一些很好的答案。
    【解决方案2】:

    对于 Java 开发人员来说,init 类似于构造函数,而 initialize 类似于类上的静态块。

    【讨论】:

    • 很棒的解释!非常感谢!
    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 2020-05-04
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多