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

Objective c 为什么在目标C构造函数中使用[super init]?,objective-c,constructor,Objective C,Constructor,假设我有一个名为Item的类。它是NewsItem和TwitterItem的超类 如果我想创建一些新闻项,我必须使用(在构造函数内部) 若有,原因为何?在Java/C中,我只想 NewsItem n = new NewsItem(); 在Java/C中,我不必对超类做任何事情。只是抓不住它。因为你的超类(以及你的超类的超类)也需要一个初始化的机会 请记住,您的超类[很少]返回nil或其他实例 这就是为什么你这样做: - (id)init { self = [super init

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

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

若有,原因为何?在Java/C中,我只想

    NewsItem n = new NewsItem();
在Java/C中,我不必对超类做任何事情。只是抓不住它。

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

请记住,您的超类[很少]返回nil或其他实例

这就是为什么你这样做:

- (id)init
{
    self = [super init];
    if (self) {
        ... init stuff ....
    }
    return self;
}
因为你的超类(以及你的超类的超类)也需要一个初始化的机会

请记住,您的超类[很少]返回nil或其他实例

这就是为什么你这样做:

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

由于您的自定义对象将至少继承所有对象的母亲:NSObject,因此必须调用“[super init];”
“super”只是调用其超类的init方法,因为您的自定义对象将至少从所有对象的母亲继承:NSObject,您必须调用“[super init];”
“super”只是调用其超类的init方法,因为您正在重写init消息。如果您不重写它,那么
[[NewsItem alloc]init]
将只调用超类的init消息。在C#中,您可以使用来执行相同的操作。

因为您正在重写init消息。如果您不重写它,那么
[[NewsItem alloc]init]
将只调用超类的init消息。在C#中,您可以使用来执行相同的操作。

在Java和C#中,如果您没有显式调用超类构造函数,编译器会自动让您的构造函数调用它。例如:

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

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

在Java和C中,如果您没有显式调用超类构造函数,编译器会自动让您的构造函数调用它。例如:

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


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

Kevin的可能重复添加了返回类型。谢谢不必严格要求,因为(id)是默认值,但我也更喜欢它。Kevin添加了返回类型。谢谢这不是绝对必要的,因为(id)是默认值,但我也更喜欢它。这正是我想要的解释。谢谢这正是我想要的解释。谢谢