Objective-C:init vs initialize

jrd*_*oko 72 initialization objective-c init initializer

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

Cal*_*leb 125

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

Objective-C编程语言-init实现初始化程序部分中详细描述了属于方法的代码.还有一些关于初始化类(即)的讨论,以及为什么你可能需要在同类文档中的类对象部分中这样做.进入的代码通常与要求您首先初始化它的类的特殊功能密切相关.在(以及任何类方法)中要记住的一件重要事情是,类方法中的类是指类本身,而不是类的实例.+initialize+initialize+initializeself

  • "在创建类的任何实例之前运行"并非真的:***在该类之前发送****接收它的第一条消息*(不包括`+ initialize`方法).实际上,您可以创建一个类的实例而不向该类发送消息(使用它的'IMP`的create-instance方法(通常是`+ allocWithZone:`但这可能会有所不同)). (12认同)
  • @WTP,公平点,但如果你在那个空间里操作,你可能已经很清楚+ initialize和-init之间的区别了. (11认同)
  • 我经常在`+ initialize`方法中看到`if(self == [NameOfClass class])`,为什么我们需要检查呢?我知道这与在父类上调用两次的`+ initialize`方法有关,但对我来说并不清楚.任何帮助赞赏! (4认同)
  • @makaed您的问题在[docs](http://bit.ly/1eSNpGI)中得到了很好的回答 - 这里是相关的一行:*如果子类没有实现初始化,则可以多次调用超类实现 - 运行时将调用继承的实现......*所以,即使每个类只调用一次`+ initialize`,也可能会多次调用一个实现 - 一次为其所在的类,一次为每个子类提供一次不执行它拥有`+ initialize`方法. (3认同)

Eki*_*Eki 18

要为Java开发人员绘制并行,init就像一个构造函数,而initialize就像一个类上的静态块.

  • 很棒的解释!非常感谢! (3认同)