子类初始化时为什么要调用self=[super init]
2020-09-28 本文已影响0人
富城
因为子类继承自父类,需要获得父类的实例和方法等,所以初始化子类之前要先保证父类已经初始化完毕,防止出错。当调用'''self=[super init]'''方法时,如果父类初始化不成功,那么会返回'nil',所以可以根据self是否为nil判断父类是否初始化成功,从而进行合理地处理,以便起到容错效果。
引申:使用dealloc方法释放对象时,为什么一定要调用'''[super dealloc]'''方法?在何处调用?
- 因为子类的很多实例变量是继承自父类的,所以要调用'''[super dealloc]'''方法来释放从父类继承来的实例变量,实际上还是释放自己的实例变量,只是继承来的这部分只能调用父类的dealloc方法来释放。
- 按照自下往上的逻辑,一般要先释放子类的实例,然后释放父类的实例。自下往上的原因是,在调用'''[super dealloc]'''方法之前如果不先把子类中的变量从内存中释放掉,容易造成子类中变量的内存积压,导致内存泄漏,所以'''[super dealloc]'''方法应该在释放掉子类变量之后最后调用。当然在ARC中就不需要考虑这些问题了,变量会自动释放,此方法也不存在了。