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

本文讨论了在Objective-C中子类初始化时是否需要调用父类初始化方法的观点A和观点B,并通过实例演示了两种不同做法及其可能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

观点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 // RetainTracker

int 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 // RetainTracker

int 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的编程中只能说这个项目就有问题了

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值