全能构造器(Designated Initializer)正常情况下是全面初始化类变量的init函数,从类的初始化函数调用中我们就可以看到。例如存在Person类继承自NSObject,包含两个属性:NSString类型的名称name,CGFloat类型的金钱money以及int类型的年龄age。那么我们总共有四个init函数,分别是:
①init ②initWithAge ③initWithAge: andName ④initWithAge: andName: andMoney
正常情况下,我们在前三个init函数里会赋予缺省初始化参数的变量一个默认值,并且调用第④个构造方法。我们都知道调用多一个方法会耗损额外的计算时间,为什么还要做这种事情呢?
我们先要知道的是,init方法是在根类NSObject中声明的,OC中所有的类都要是NSObject的子类,所以在调用构造器方法时,我们必须同时调用[super initXXX]类似的构造函数,而父类中继续向上调用直到根类初始化完毕再从构造链上一次次回来初始化子类,而且每一个父类构造器只能返回固定一个子类构造器。因为Person类中比NSObject父类多了三个额外的构造器函数,父类中并不存在②、③、④的同名方法,所以不知道Designated Initializer设计的开发者可能在四个构造器里都会调用[super init]这个方法,但是这个方法只会返回调用第一次调用它的子类构造器,所以在实际开发中,这可能会造成隐患。
因此,正常情况下,我们必须在类中创造一个全能构造器,让所有其它构造器都调用它来进行初始化,由全能构造器(Designated Initializer)来调用父类的构造器,或者重写父类的构造器方法。当然,如果父类是NSObject,第二种方式只能通过runtime进行强制添加。