第 7 条:在对象内部尽量直接访问实例变量
2016-01-07 本文已影响80人
对歌当酒
强烈建议:读取实例变量时直接访问;设置实例变量时通过属性。
示例代码:
@interface EOCPerson : NSObject
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
// Convenience for firstName + " " + lastName:
- (NSString*)fullName;
- (void)setFullName:(NSString*)fullName;
@end
方法实现(点语法形式):
- (NSString*)fullName {
return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
}
- (void)setFullName:(NSString *)fullName {
NSArray *components = [fullName componentsSeparatedByString:@" "];
self.firstName = [components objectAtIndex:0];
self.lastName = [components objectAtIndex:1];
}
直接访问实例变量形式:
- (NSString*)fullName {
return [NSString stringWithFormat:@"%@ %@", _firstName, _lastName];
}
- (void)setFullName:(NSString *)fullName {
NSArray *components = [fullName componentsSeparatedByString:@" "];
_firstName = [components objectAtIndex:0];
_lastName = [components objectAtIndex:1];
}
区别:
- 直接访问实例变量的特点:不经过 OC 的“方法派送”(method dispatch),速度更快;不会调用
setter
方法,绕过了“内存管理语义”;不会触发“键值观测”(Key-Value Observing, KVO)通知。 - 属性访问优点:可以给
getter
和/或setter
方法新增断点,便于查错。
一种合理的折中方案:写入实例变量时,通过“设置方法”;读取实例变量时,直接访问。
原因:既能提高读取操作的速度,又能控制对属性的写入操作。
惰性(延迟)实例化示例代码:
- (EOCBrain*)brain {
if (!_brain) {
_brain = [Brain new];
}
return _brain;
}
一些名词:
“键值观测”(Key-Value Observing, KVO)通知:一种通知机制,当某对象属性改变时,可通知其他对象。