cari

Rumah  >  Soal Jawab  >  teks badan

Isu dengan getter/setter dalam iOS

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];
巴扎黑巴扎黑2823 hari yang lalu584

membalas semua(1)saya akan balas

  • 大家讲道理

    大家讲道理2017-05-02 09:32:21

    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: 方法

    balas
    0
  • Batalbalas