问题描述
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;}@endClass - SmithPerson@interface SmithPerson : Person@end@implementation SmithPerson- (instancetype)init { self = [super init]; if (self) {self.lastName = @'aaa'; } return self;}@end
以上在子类SmithPerson中没有重写lastName的getter/setter方法,我可以在init中通过self.lastName重新赋值,但是如果我在子类重写了getter/setter,那怎么重新赋值呢?self.lastName会调用子类的setter方法,setter中如果这样赋值就死循环了
- (void)setLastName:(NSString *)lastName { self.lastName = lastName;}
另外:如果将Person和SmithPerson的init方法改成下面这样,同时子类重写父类lastName的getter/setter:
Person- (instancetype)init { self = [super init]; if (self) {**self.lastName = @'abc';** } return self;}SmithPerson- (instancetype)init { self = [super init]; if (self) { } return self;}
那么执行下面语句时,父类初始化时的self.lastName为什么会调用子类的setter
SmithPerson *p1 = [[SmithPerson alloc] init];
问题解答
回答1:1、子类重写了getter/setter
@interface SmithPerson : Person@end@implementation SmithPerson- (void)setLastName:(NSString *)lastName { [super setLastName:lastName];}@end
2、
self.lastName = @'abc';//该方法等价于 [self setLastName:@'abc'];//self 的类型为SmithPerson,所以会调用SmithPerson 类的 -setLastName: 方法