在Cocoa中,对于NSObject
s,init
和initialize
不应该都是类方法吗?
覆盖+initialize
(它是可选的)以执行类范围的初始化。 -init
执行类的单个实例的初始化,尽管它通常是通过在派生自 NSObject 的类中添加参数来优化的(例如:UIView 的 initWithFrame:
方法)。
由于-init
初始化单个实例(特别是,它有权访问实例的变量),因此它不能是类方法。
从文档中:
运行时在从程序内部向类或从它继承的任何类发送其第一条消息之前,向程序中的每个类发送初始化。
这意味着,第一次向类发送消息时,无论是alloc
还是某个定义的类方法,initialize
在应用程序的整个运行过程中首先调用一次。与load
相反,可以在项目中包含一个类并且永远不会命中initialize
。
另一方面,init
由子类实现,用于在分配内存后立即初始化新对象(接收器)。
这意味着,init
纯粹用于初始化类实例。
编辑--
在编辑的问题之后,alloc
创建实例,同时init
初始化它,这就是为什么alloc
是类方法而init
是实例方法的原因。