为什么 -init 是实例方法并 +初始化类方法



在Cocoa中,对于NSObject s,initinitialize不应该都是类方法吗?

可以

覆盖+initialize(它是可选的)以执行类范围的初始化。 -init执行类的单个实例的初始化,尽管它通常是通过在派生自 NSObject 的类中添加参数来优化的(例如:UIView 的 initWithFrame: 方法)。

由于-init初始化单个实例(特别是,它有权访问实例的变量),因此它不能是类方法。

从文档中:

运行时在从程序内部向类或从它继承的任何类发送其第一条消息之前,向程序中的每个类发送初始化。

这意味着,第一次向类发送消息时,无论是alloc还是某个定义的类方法,initialize在应用程序的整个运行过程中首先调用一次。与load相反,可以在项目中包含一个类并且永远不会命中initialize

另一方面,init

由子类实现,用于在分配内存后立即初始化新对象(接收器)。

这意味着,init纯粹用于初始化类实例

编辑--

在编辑的问题之后,alloc创建实例,同时init初始化它,这就是为什么alloc是类方法而init是实例方法的原因。

最新更新