Objective-C:初始化与初始化


Answers:


126

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

Objective-C编程语言-init实现初始化程序部分中,对方法中属于的代码进行了详细描述。在类对象一节中,还讨论了初始化类(即)以及为什么可能需要在同一文档中进行初始化的问题。通常,进入的代码将与该类的特殊功能紧密联系在一起,而该类的特殊功能要求您首先对其进行初始化。在(以及任何类方法中)要记住的重要一件事是,在类方法中,引用的是类本身,而不是类的实例。+initialize+initialize+initializeself


12
“跑在创建类的任何实例之前,”不是真的:发送之前类接收它的第一个消息(不包括+initialize方法)。实际上,您可以创建一个类的实例而无需发送该类消息(使用IMP它的create-instance方法(通常,+allocWithZone:但这可能有所不同))。

11
@WTP,很公平,但是如果您在该空间中操作,则可能已经很清楚+ initialize和-init之间的区别了。
卡莱布

4
我通常会看到if (self == [NameOfClass class])内部+initialize方法,为什么我们需要检查一下?我知道这与+initialize在父类上两次调用方法有关,但我不清楚。任何帮助表示赞赏!
2014年

3
@makaed您的问题在文档中得到了很好的回答-这是相关的代码行:如果子类未实现初始化,则超类实现可能会多次调用-运行时将调用继承的实现...因此,即使+initialize仅调用一次对于每个类,可能会多次调用一个实现-一次是针对其所在的类,一次是针对每个不提供其自身+initialize方法的子类。
Caleb 2014年

1
啊,谢谢!现在这很有意义。我还提出了一个问题,并给出了一些很好的答案。
2014年

18

要为Java开发人员画出一个平行线,init就像构造函数,而initialize就像是类上的静态块。


3
很棒的解释!非常感谢!
Sakthimuthiah 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.