2012-02-14 93 views
1

假设我有一个名为Item的类。这是NewsItem和TwitterItem的超类。为什么在Objective C构造函数中使用[super init]?

如果我想创造一些NewsItem的做我必须使用(内部构造)

self = [super init]; 

如果是,为什么?在Java/C#中,我只想做,

NewsItem n = new NewsItem(); 

我不必在Java/C#中对超类做任何事情。只是无法把握它。

+1

可能的重复[为什么我应该调用self = \ [super init \]](http://stackoverflow.com/questions/2956943/why-should-i-call-self-super-init) – 2012-02-14 19:43:07

回答

6

在Java和C#中,如果不明确调用它,编译器会自动让您的构造函数调用超类的构造函数。例如,the “Java Tutorials” say this

如果构造函数没有明确调用父类的构造函数,Java编译器会自动插入到超类的无参构造函数的调用。如果超类没有没有参数的构造函数,那么你会得到一个编译时错误。对象确实有这样的构造函数,所以如果Object是唯一的超类,那就没有问题了。

在Objective-C中,编译器不会自动执行它,所以你必须自己做。

+0

这正是我想要的解释。谢谢 – xrDDDD 2012-02-15 23:40:51

5

因为你的超类(和你的超类的超类)也需要初始化的机会。

而且,请记住,您的超类将[很少]返回零或不同的实例。

这就是为什么你做的事:

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     ... init stuff .... 
    } 
    return self; 
} 
+0

Kevin补充说返回类型。谢谢。由于(id)是默认值,因此不是必须的,但我也更喜欢它。 – bbum 2012-02-14 22:57:51

0

因为您的自定义对象将至少从所有对象的母亲那里继承:NSObject的,你必须调用“[超级初始化];” 'super'只是调用其超类的init方法

1

因为您正在重写init消息。如果你不覆盖它,那么[[NewsItem alloc] init]只会调用超类的init消息。在C#中,你可以使用base来做同样的事情。

相关问题