第一阶段,每一个存储属性被引入类分配了一个初始值。一旦存储属性的初始状态被确定,第二阶段就开始了。每个类都有机会在新的实例使用之前来定制它的存储属性。
初始化安全,同时在每一个类的层级结构给与了完备的灵活性。两段式初始化过程可以防止属性值在初始化之前被访问,还可以防止属性值被另一个初始化器赋予不同的值。
安全检查1
指定初始化器必须保证在向上委托给父类初始化器之前,其所在类引入的所有属性都要初始化完成。一个对象的内存只有在其所有属性确定之后才能完全初始化,为了满足这一规则,指定初始化器必须保证它自己的属性在它上交委托之前先完成初始化。
安全检查2
指定初始化器必须先向上委托父类初始化器,然后才能为继承的属性设置新值。如果不这样做,指定初始化器赋予的新值将被父类中的初始化器所覆盖。
安全检查3
便捷初始化器必须先委托同类中的其他初始化器,然后再为任意属性赋值(包括同类里定义的属性)。如果不这样做,便捷初始化器赋予的新值将被自己类中其它指定初始化器所覆盖。
安全检查4
初始化器在第一阶段初始化完成之前,不能调用任何实例方法,不能读取任何实例属性的值,也不能引用self做为值。
阶段1
指定或便捷初始化器在类中被调用;
为这个类的新实例分配内存,内存还没有被初始化;
这个类的指定初始化器确保所有由此类引入的存储属性都有一个值。现在这些存储属性的内存被初始化了;
指定初始化器上交父类的初始化器为其存储属性执行相同的任务;
这个调用父类初始化器的过程将沿着初始化器链一直向上进行,知道达到初始化器链的最顶部;
一旦到达最顶部,在顶部的类确保所有的存储属性都有一个值,此实例的内存被认为完全初始化了,第一阶段完成。
阶段2
从顶部初始化器往下,链中的每一个指定初始化器都有机会进一步定制实例。初始化器现在能够访问self并且可以修改它的属性,调用它的实例方法等等。
最终,链中任何便捷初始化器都有机会定制实例及使用self.