嗯...我已经阅读并做了很多研究,目的是在object-c的类继承中表达[super init]。甚至某些问题都已经在stackoverflow上得到了很好的解释和回答。但是,我仍然不太了解继承或[super init]是如何工作的。
在其他语言中,超类对子类一无所知。超类无法返回子类的对象,因为超类不了解子类。所以我的问题是,表达式self = [super init]是否返回 SUPERCLASS 或 SUBCLASS 的对象。在这里,我确实知道[super init]可以返回另一个对象或nil,这很有意义。但是,假设一切正常,既不是nil也不返回另一个对象。如果返回一个常规对象,它是否返回超类或派生类的对象,超类或派生类是定义此 self = [super init] 的类。如果它返回超类的对象,那么这是有道理的,但是由于众所周知,超类的对象对子类一无所知,因此它如何访问子类的成员(字段,消息或方法)。如果它返回子类的对象,则没有任何意义,因为超类无法对派生类的对象进行返回,因为超类对此一无所知。
对于那些从其他语言过渡到Objective-C的人来说,这是真正令人困惑的方面之一。
答案 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?