Isu dengan getter/setter dalam iOS
巴扎黑
巴扎黑 2017-05-02 09:30:21
0
1
606
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

Perkara di atas tidak mengatasi kaedah getter/setter lastName dalam subkelas SmithPerson Saya boleh menetapkan semula nilai melalui self.lastName dalam init, tetapi jika saya menulis semula getter/setter dalam subkelas, bagaimanakah saya menetapkannya semula? self.lastName akan memanggil kaedah penetap subkelas Jika nilai ditetapkan dalam penetap seperti ini, ia akan menjadi gelung tak terhingga

- (void)setLastName:(NSString *)lastName {
    self.lastName = lastName;
}

Selain itu: Jika anda menukar kaedah init Person dan SmithPerson kepada yang berikut, dan subkelas menulis semula getter/setter bagi lastName kelas induk:

Person
- (instancetype)init {
    self = [super init];
    if (self) {
        **self.lastName = @"abc";**
    }
    return self;
}

SmithPerson
- (instancetype)init {
    self = [super init];
    if (self) {
    }
    return self;
}

Jadi apabila penyataan berikut dilaksanakan, mengapa self.lastName apabila kelas induk dimulakan memanggil penetap subkelas

SmithPerson *p1 = [[SmithPerson alloc] init];
巴扎黑
巴扎黑

membalas semua(1)
大家讲道理

1. Subkelas menulis semula 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: 方法
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan