Objective-C:init与initialize的区别

78
在Objective-C中,init方法(即类的指定初始化器)和initialize方法有什么区别?哪些初始化代码应该放在每个方法中?
2个回答

125

-init 是一个实例方法,用于初始化特定的对象。而 +initialize 是一个类方法,在创建该类的任何实例以及运行其他类方法之前运行。通常情况下,你不会经常使用 +initialize ,但是它可以方便地设置类作为整体可能使用的静态变量,或确保在创建任何实例之前满足某些条件。

关于应该放在 -init 方法中的代码,在实现初始化器部分的 Objective-C 编程语言 文档中有详细介绍。 在同一文档的Class Objects 部分也讨论了初始化类(即 +initialize )及其原因。放在 +initialize 中的代码通常与需要初始化的类的特殊功能密切相关。在任何类方法中,包括 +initialize 中,有一件重要的事情要记住,即类方法中的 self 指的是类本身,而不是类的实例。


12
“在创建类的任何实例之前运行”并不准确:它是在该类“收到其第一个消息”之前发送的(不包括 +initialize 方法)。实际上,您可以创建一个类的实例,而无需向该类发送消息(使用其创建实例方法的 IMP(通常为 +allocWithZone:,但这可能会有所不同))。 - user142019
11
@WTP,观点很中肯,但如果你在这个领域打拼,你可能已经非常清楚+initialize和-init之间的区别了。 - Caleb
4
我通常看到在+initialize方法中写上if (self == [NameOfClass class])这句代码,为什么要这样检查呢?我知道这与+initialize方法会在父类中被调用两次有关,但是我不太清楚。谢谢帮助! - makaed
3
你的问题已经在文档中得到了很好的回答,相关行如下:*如果子类没有实现initialize方法,则可以多次调用超类实现 - 运行时将调用继承的实现...*因此,即使每个类只调用一次+initialize方法,但单个实现可能会被调用多次 - 一次是在它所在的类中,其他还有每个没有提供自己的+initialize方法的子类中。 - Caleb
1
啊,谢谢!现在有意义了。我还创建了一个问题,得到了一些好的答案。 - makaed

19
为了对Java开发人员进行类比,init类似于构造函数,而initialize类似于类的静态块。

4
太棒了的解释!非常感谢! - Sakthimuthiah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接