第七条:在对象内部访问实例变量
1.区分“通过属性访问”与“直接访问”
// 通过属性访问:
self.firstName
// 直接访问:
_firstName
2.在对象内部访问实例变量应该怎么做?
(1)在写入实例变量时,通过其”set方法”来做
self.firstName = @"aaa";
self.lastName = @"bbb";
(2)在读取实例变量时,则直接访问它
NSLog(@"全名是 = %@", [NSString stringWithFormat:@"%@, %@", _firstName, _lastName]);
3.具体使用时需要注意的
(1)不要在setter方法中调用setter方法
- (void)setName:(NSString *)name {
_name = [name copy]; // 正确写法
self.name = name; // 会报错
}
(2)不要在init和dealloc方法中调用setter/getter方法
- (instancetype)init {
self = [super init];
if (self) {
self.name = @""; // 会报错
_name = @""; // 正确写法
}
return self;
}
(3)在惰性初始化中必须通过getter方法访问属性
- (NSNumber *)gameCount {
if (!_gameCount) {
_gameCount = @13;
}
return _gameCount;
}
NSLog(@"玩游戏的次数 = %d", [_gameCount integerValue]); // nil ,错误写法,属行未初始化
NSLog(@"玩游戏的次数 = %d", [self.gameCount integerValue]); // 13 ,正确写法