Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 返回[super Init]的对象_Objective C - Fatal编程技术网

Objective c 返回[super Init]的对象

Objective c 返回[super Init]的对象,objective-c,Objective C,嗯……我已经阅读并研究了[super init]在objective-c类继承中的表达式。甚至有些问题在stackoverflow上也得到了很好的解释和回答。然而,我仍然不太明白继承或[super init]是如何工作的 在其他语言中,超类对子类一无所知。超类无法返回子类的对象,因为超类不知道该子类。所以我的问题是表达式self=[super init]是否返回超类或子类的对象。这里我知道[super init]可以返回另一个对象或nil,这是有意义的。但假设一切正常,既不是零也不是返回另一个对

嗯……我已经阅读并研究了[super init]在objective-c类继承中的表达式。甚至有些问题在stackoverflow上也得到了很好的解释和回答。然而,我仍然不太明白继承或[super init]是如何工作的

在其他语言中,超类对子类一无所知。超类无法返回子类的对象,因为超类不知道该子类。所以我的问题是表达式self=[super init]是否返回超类子类的对象。这里我知道[super init]可以返回另一个对象或nil,这是有意义的。但假设一切正常,既不是零也不是返回另一个对象。如果它返回一个常规对象,它是否返回超类或派生类的对象,该类就是定义此self=[super init]的类。如果它返回一个超类的对象,那么它是有意义的,但是正如我们所知,超类的对象对子类一无所知,它如何访问子类的成员(字段、消息或方法)。如果它返回子类的对象,那么它就没有意义,因为超类无法返回派生类的对象,因为超类对此一无所知


对于那些从其他语言过渡到objective-C的人来说,这是一个非常令人困惑的方面。

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
  • 对类
    B
    的新创建对象调用
    init
  • 然后从
    B
    的init方法调用类
    A
    上的
    init
  • A
    上的
    init
    将*返回分配有
    B
    alloc
    的对象
*)请注意,
init
方法可能返回分配对象以外的另一个对象。这是允许的,也是您通常应该将结果分配给
self
的原因


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
  • 对类
    B
    的新创建对象调用
    init
  • 然后从
    B
    的init方法调用类
    A
    上的
    init
  • A
    上的
    init
    将*返回分配有
    B
    alloc
    的对象
*)请注意,
init
方法可能返回分配对象以外的另一个对象。这是允许的,也是您通常应该将结果分配给
self
的原因


那么您的意思是当调用[super init]时,属于或当前类的self的隐藏参数会随之传递?否则,我看不出超类如何返回子类的对象。因为和其他语言一样,超类对子类一无所知。是的,所有实例方法在调用时都会收到一个隐藏的self参数。实例方法是以“-”开头声明的,与以“+”开头的类方法(如alloc)相反。您的意思是当调用[super init]时,属于或当前类的self的隐藏参数会随之传递?否则,我看不出超类如何返回子类的对象。因为和其他语言一样,超类对子类一无所知。是的,所有实例方法在调用时都会收到一个隐藏的self参数。实例方法是用初始值“-”声明的,与以“+”开头的类方法(如alloc)相反。