我在子类中覆盖了一个属性的setter,但是当我在超类的init方法中调用它时,为什么子类的方法响应?

肾上腺素

当我编码时:

//Father.m
@implementation Father

- (instancetype)init {
    if (self = [super init]) {
        self.name = @"super class";

    }
    return self;
}

- (void)setName:(NSString *)name {
    _name = [name copy];
    NSLog(@"super class");
}
@end

在子类“Son”中,我覆盖了方法“setName:”:

@synthesize name = _name;
- (instancetype)init {
    if (self = [super init]) {
        self.name = @"sub class";

    }
    return self;
}
- (void)setName:(NSString *)name {
    _name = [name copy];
    NSLog(@"sub class");
}

当我这样称呼时:

Son *s = [[Son alloc] init];

它打印这个:

sub class
sub class

为什么不:

super class
sub class

谁能解释为什么它两次调用子类的 setter?

霍洛

Son调用self = [super init]at- init时,会调用Father 的init方法,而 inFather- init方法,self代表的是时间Son,因为super它只是编译器的一个关键字。在运行阶段,它实际上是objc_msgSendSuper函数发送的消息objc_msgSendSuper是一个结构体,第一个参数是objc_super结构体指针,在结构体内部,第一个成员是receiver,它代表Son

struct objc_super {     
id receiver;
Class super_class;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章