看别人推荐如题这种做法,是我的理解有误?
我个人一直理解,只有在重写init时 调用if (self = [super init]);
而像其他自定义的方法 initWithXXX等时 应该都调用 self = [self init]?
看别人推荐如题这种做法,是我的理解有误?
我个人一直理解,只有在重写init时 调用if (self = [super init]);
而像其他自定义的方法 initWithXXX等时 应该都调用 self = [self init]?
super 就是个障眼法 ,编译器符号, 它可以替换成 [slef class], 只不过 使用[super init]方法是从 self 的超类的方法列表中开始 寻找对应的实现。
如果你在本类中重写了init方法,并且做了一些必须的初始化工作,当你使用initWith:这种初始化方法创建实例时,不想在initWith:里面重写init方法里面的初始化工作,就需要使用[self init]。
复杂的不用说,就说在一个方法的实现中调用这个方法本身,这种代码显然是要崩的,底层C语言就不允许函数这样写。你既然写了initWith,里面自然可以调self init,根本不是一个方法了。写个dogRun方法里面一样可以调用init作为初始化方法
2 回答1.1k 阅读
1 回答1.2k 阅读✓ 已解决
1 回答2.8k 阅读
1 回答1.4k 阅读
1.7k 阅读
1 回答952 阅读
1 回答792 阅读
这不是推荐不推荐的问题,是逻辑不一样。调
[self init]
会执行你写在-(id)init
里的代码,而[super init]
会绕过这些代码,直接执行父类的init
方法。到底调哪个,要看你希望逻辑是怎样。如果你没写-(id)init
,那这两个完全一样。Swift 这一点说得更清楚一些。调
[super init]
的是指定构造器,调[self init]
的是便利构造器。一般来说,如果这个类有两个完全不同的初始化方式(比如 initWithFrame、 initWithCoder 这种),不应该互相调用,应该调 super 的 init 方法;如果一个初始化方法只是在另一个基础上做点小修改,那就应该调 self 的 init 方法。