扫码关注官方订阅号
看别人推荐如题这种做法,是我的理解有误?
我个人一直理解,只有在重写init时 调用if (self = [super init]);而像其他自定义的方法 initWithXXX等时 应该都调用 self = [self init]?
欢迎选择我的课程,让我们一起见证您的进步~~
这不是推荐不推荐的问题,是逻辑不一样。调[self init]会执行你写在-(id)init里的代码,而[super init]会绕过这些代码,直接执行父类的init方法。到底调哪个,要看你希望逻辑是怎样。如果你没写-(id)init,那这两个完全一样。
[self init]
-(id)init
[super init]
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作为初始化方法
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
这不是推荐不推荐的问题,是逻辑不一样。调
[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作为初始化方法