Objective-c - Problèmes avec les getters/setters dans iOS
巴扎黑
巴扎黑 2017-05-02 09:30:21
0
1
581
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];
巴扎黑
巴扎黑

répondre à tous(1)
大家讲道理

1. Les sous-classes réécrivent le 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: 方法
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal