iOS开发·子类初始化时为什么要调用self=[super init]

[self class]、[self superclass]、[super class]分别表示什么意思?

  • [self class]是表示当前类、self是指向自己的指针,可以打印出来
  • [self superclass] 是表示当前类的父类
  • [super class] : 首先super不是指针,只是关键字,不能打印出来;其次这个[super class]表示的是当前对象,而且super可以用来调用父类方法,比如[super init],表示当前类对象调用父类初始化方法。

因为子类继承自父类,需要获得父类的实例和方法等,所以初始化子类之前要先保证父类已经初始化完毕,防止出错。当调用self = [super init]方法时,如果父类初始化不成功,那么会返回nil,所以可以根据self是否为nil判断父类是否初始化成功,从而进行合理地处理,以便起到容错效果。

引申:使用dealloc方法释放对象时,为什么一定要调用[super dealloc]方法?在何处调用?

  • 因为子类的很多实例变量是继承自父类的,所以要调用[super dealloc]方法来释放从父类继承来的实例变量,实际上还是释放自己的实例变量,只是继承来的这部分只能调用父类的dealloc方法来释放。
  • 按照自下往上的逻辑,一般要先释放子类的实例,然后释放父类的实例。自下往上的原因是,在调用[super dealloc]方法之前如果不先把子类中的变量从内存中释放掉,容易造成子类中变量的内存积压,导致内存泄漏,所以[super dealloc]方法应该在释放掉子类变量之后最后调用。当然在ARC中就不需要考虑这些问题了,变量会自动释放,此方法也不存在了。

你可能感兴趣的:(iOS开发·子类初始化时为什么要调用self=[super init])