objective-c - iOS中getter/setter的问题

 手机用户2502868585 发布于 2022-10-25 00:49
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: 方法
    2022-10-26 01:44 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有