[super Init]

时间:2019-01-10 06:14:47

标签: objective-c

嗯...我已经阅读并做了很多研究,目的是在object-c的类继承中表达[super init]。甚至某些问题都已经在stackoverflow上得到了很好的解释和回答。但是,我仍然不太了解继承或[super init]是如何工作的。

在其他语言中,超类对子类一无所知。超类无法返回子类的对象,因为超类不了解子类。所以我的问题是,表达式self = [super init]是否返回 SUPERCLASS SUBCLASS 的对象。在这里,我确实知道[super init]可以返回另一个对象或nil,这很有意义。但是,假设一切正常,既不是nil也不返回另一个对象。如果返回一个常规对象,它是否返回超类或派生类的对象,超类或派生类是定义此 self = [super init] 的类。如果它返回超类的对象,那么这是有道理的,但是由于众所周知,超类的对象对子类一无所知,因此它如何访问子类的成员(字段,消息或方法)。如果它返回子类的对象,则没有任何意义,因为超类无法对派生类的对象进行返回,因为超类对此一无所知。

对于那些从其他语言过渡到Objective-C的人来说,这是真正令人困惑的方面之一。

1 个答案:

答案 0 :(得分:2)

self = [super init] 从超类返回对象。但是,请注意,对象本身可能已在当前类上使用alloc进行了分配。

请考虑以下内容:

@interface A : NSObject
- (instancetype)init;
@end

@interface B : A
- (instancetype)init;
@end

@implementation B
- (instancetype)init {
    self = [super init];
    if (self) {
        // Do initialization for B
    }
    return self;
}
@end

创建类B的新对象时,请执行以下操作:

B *obj = [[B alloc] init];

依次发生以下情况:

  • [B alloc]为对象分配足够的空间来容纳所有B
  • 在类init的新创建对象上调用B
  • 然后从init的init方法调用类A上的B
  • init上的
  • A将*返回分配有B的{​​{1}}的对象。

*)注意alloc方法可能返回除分配的对象之外的另一个对象。这是允许的,这也是为什么您通常应将结果分配给init的原因。

Read more - What does it mean when you assign [super init] to self?