objective-c - iOS中getter/setter的问题
巴扎黑
巴扎黑 2017-05-02 09:30:21
0
1
522
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

以上在子类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: 方法
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责声明 Sitemap
    PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!