为什么在Objective C构造函数中使用[super init]?

xrD*_*DDD 1 constructor objective-c

假设我有一个名为Item的类.这是NewsItem和TwitterItem的超类.

如果我想创建一些NewsItem,我必须使用(内部构造函数)

    self = [super init];
Run Code Online (Sandbox Code Playgroud)

如果是,为什么?在Java/C#中我会这样做,

    NewsItem n = new NewsItem();
Run Code Online (Sandbox Code Playgroud)

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

rob*_*off 6

在Java和C#中,如果您没有显式调用它,编译器会自动使您的构造函数调用超类构造函数.例如,"Java Tutorials"这样说:

如果构造函数未显式调用超类构造函数,则Java编译器会自动插入对超类的无参数构造函数的调用.如果超类没有无参数构造函数,则会出现编译时错误.对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题.

在Objective-C中,编译器不会自动执行,因此您必须自己执行此操作.


bbu*_*bum 5

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

并且,请记住,您的超类将[很少]返回nil或不同的实例.

这就是你这样做的原因:

- (id)init
{
    self = [super init];
    if (self) {
        ... init stuff ....
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)