为何建议在init方法中建议调用self = [super init]

看别人推荐如题这种做法,是我的理解有误?

我个人一直理解,只有在重写init时 调用if (self = [super init]);
而像其他自定义的方法 initWithXXX等时 应该都调用 self = [self init]?

阅读 6.6k
3 个回答

这不是推荐不推荐的问题,是逻辑不一样。调[self init]会执行你写在-(id)init里的代码,而[super init]会绕过这些代码,直接执行父类的init方法。到底调哪个,要看你希望逻辑是怎样。如果你没写-(id)init,那这两个完全一样。

Swift 这一点说得更清楚一些。调[super init]的是指定构造器,调[self init]的是便利构造器。一般来说,如果这个类有两个完全不同的初始化方式(比如 initWithFrame、 initWithCoder 这种),不应该互相调用,应该调 super 的 init 方法;如果一个初始化方法只是在另一个基础上做点小修改,那就应该调 self 的 init 方法。

super 就是个障眼法 ,编译器符号, 它可以替换成 [slef class], 只不过 使用[super init]方法是从 self 的超类的方法列表中开始 寻找对应的实现。

如果你在本类中重写了init方法,并且做了一些必须的初始化工作,当你使用initWith:这种初始化方法创建实例时,不想在initWith:里面重写init方法里面的初始化工作,就需要使用[self init]。

复杂的不用说,就说在一个方法的实现中调用这个方法本身,这种代码显然是要崩的,底层C语言就不允许函数这样写。你既然写了initWith,里面自然可以调self init,根本不是一个方法了。写个dogRun方法里面一样可以调用init作为初始化方法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题