当我编码时:
//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] 删除。
我来说两句