【Objective-C编程开发】关于子类重写父类初始化方法的争论

来源:互联网 发布:mysql安装教程5.28 编辑:程序博客网 时间:2024/05/05 16:32

写出本篇文章实属不是我的本意,只因今天在相关技术群上有两个人争得耳红眼赤.今天趁着有空写出这个基础性内容,希望能帮到有些新手的疑惑。

观点A:认为在子类重写的init中没有必要进行self =[super init]父类的初始化、每个子类可以不依靠父类单独进行实例化子类,这样也不会影响到他对父类除了私有属性私有方法外的其他内容的调用。

观点B:一定要在子类重写init中进行父类初始化成功的判断 也就是 if(self =[super init]).否则可能会带来一系理未知的问题

OK.现在我们就以他们两人的观点进行实践与解析:

1.观点A:

@implementation RetainTracker- (id) init{//if (self = [super init])//    {NSLog (@"我没有进行父类初始化");//}return (self);} // init@end // RetainTrackerint main(int argc, const char * argv[]){    RetainTracker* retain =[[RetainTracker alloc]init];        return (0);}

运行后效果图:

2015-08-09 13:30:55.122 RetainCount[5439:2729681] 我没有进行父类初始化
2.观点B:

#import <Foundation/Foundation.h>@interface RetainTracker : NSObject@end // RetainTracker@implementation RetainTracker- (id) init{if (self = [super init])    {NSLog (@"我进行了父类初始化");}return (self);} // init@end // RetainTrackerint main(int argc, const char * argv[]){    RetainTracker* retain =[[RetainTracker alloc]init];        return (0);}
运行后效果图:

2015-08-09 13:32:53.786 RetainCount[5455:2741074] 我进行了父类初始化

貌似两人都能成功实现,这样是不是证明观点A所说的思想是对的。我想说NO.观点A的不进行父类初始化没报错能实现也是事实。只不过是还没遇到真正的工程遇到父类初始化有问题的。举个例子:例如当父类作为包含初始化图片的这部分内容。如果这个图片丢失了则加了self =super init这个判断可以大大的提高安全性跟完整性。保证子类不会明知父类有东西有毛病还冒死的初始化执行下去。而当这个问题出现在观点A的编程中只能说这个项目就有问题了

作为一个优秀的程序员,像安全性的这些问题我也就不用多讲了,这些都必定是我们需要考虑的东西,尤其在线程的编程上。


关于这个争论点就分析到这里,有讲的不对的地方还望指出互相探讨。

0 0