OC的全能构造器

本文探讨了Objective-C中全能构造器(Designated Initializer)的重要性,解释了为何即使会增加计算时间,也需要在不同初始化方法中调用它。内容提到,由于 OC 类继承自 NSObject 并且每个父类构造器只能返回一个子类构造器,错误的构造器调用顺序可能导致隐患。正确的做法是设定一个全能构造器,确保所有其他构造器都通过它来调用父类的初始化方法,以避免问题的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全能构造器(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进行强制添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值