假设我有一个名为Item的类。这是NewsItem和TwitterItem的超类。为什么在Objective C构造函数中使用[super init]?
如果我想创造一些NewsItem的做我必须使用(内部构造)
self = [super init];
如果是,为什么?在Java/C#中,我只想做,
NewsItem n = new NewsItem();
我不必在Java/C#中对超类做任何事情。只是无法把握它。
假设我有一个名为Item的类。这是NewsItem和TwitterItem的超类。为什么在Objective C构造函数中使用[super init]?
如果我想创造一些NewsItem的做我必须使用(内部构造)
self = [super init];
如果是,为什么?在Java/C#中,我只想做,
NewsItem n = new NewsItem();
我不必在Java/C#中对超类做任何事情。只是无法把握它。
在Java和C#中,如果不明确调用它,编译器会自动让您的构造函数调用超类的构造函数。例如,the “Java Tutorials” say this:
如果构造函数没有明确调用父类的构造函数,Java编译器会自动插入到超类的无参构造函数的调用。如果超类没有没有参数的构造函数,那么你会得到一个编译时错误。对象确实有这样的构造函数,所以如果Object是唯一的超类,那就没有问题了。
在Objective-C中,编译器不会自动执行它,所以你必须自己做。
这正是我想要的解释。谢谢 – xrDDDD 2012-02-15 23:40:51
因为你的超类(和你的超类的超类)也需要初始化的机会。
而且,请记住,您的超类将[很少]返回零或不同的实例。
这就是为什么你做的事:
- (id)init
{
self = [super init];
if (self) {
... init stuff ....
}
return self;
}
Kevin补充说返回类型。谢谢。由于(id)是默认值,因此不是必须的,但我也更喜欢它。 – bbum 2012-02-14 22:57:51
因为您的自定义对象将至少从所有对象的母亲那里继承:NSObject的,你必须调用“[超级初始化];” 'super'只是调用其超类的init方法
因为您正在重写init消息。如果你不覆盖它,那么[[NewsItem alloc] init]
只会调用超类的init消息。在C#中,你可以使用base来做同样的事情。
可能的重复[为什么我应该调用self = \ [super init \]](http://stackoverflow.com/questions/2956943/why-should-i-call-self-super-init) – 2012-02-14 19:43:07