Class - Person
@interface Person : NSObject
@property (nonatomic, copy) NSString *lastName;
@end
@implementation Person
@synthesize lastName = _lastName;
- (instancetype)init {
self = [super init];
if (self) {
_lastName = @"abc";
}
return self;
}
- (NSString *)lastName {
return _lastName;
}
- (void)setLastName:(NSString *)lastName {
_lastName = lastName;
}
@end
Class - SmithPerson
@interface SmithPerson : Person
@end
@implementation SmithPerson
- (instancetype)init {
self = [super init];
if (self) {
self.lastName = @"aaa";
}
return self;
}
@end
Ce qui précède ne remplace pas la méthode getter/setter de lastName dans la sous-classe SmithPerson. Je peux réaffecter la valeur via self.lastName dans init, mais si je réécris le getter/setter dans la sous-classe, comment puis-je le réaffecter ? self.lastName appellera la méthode setter de la sous-classe Si la valeur est assignée dans le setter comme ceci, ce sera une boucle infinie
.- (void)setLastName:(NSString *)lastName {
self.lastName = lastName;
}
De plus : si vous modifiez la méthode init de Person et SmithPerson comme suit et que la sous-classe réécrit le getter/setter de la classe parent lastName :
Person
- (instancetype)init {
self = [super init];
if (self) {
**self.lastName = @"abc";**
}
return self;
}
SmithPerson
- (instancetype)init {
self = [super init];
if (self) {
}
return self;
}
Donc, lorsque l'instruction suivante est exécutée, pourquoi self.lastName lorsque la classe parent est initialisée appelle-t-il le setter de la sous-classe
SmithPerson *p1 = [[SmithPerson alloc] init];
1. Les sous-classes réécrivent le getter/setter
2,