美文网首页
第 7 条:在对象内部尽量直接访问实例变量

第 7 条:在对象内部尽量直接访问实例变量

作者: 对歌当酒 | 来源:发表于2016-01-07 20:37 被阅读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];
}

区别:

  1. 直接访问实例变量的特点:不经过 OC 的“方法派送”(method dispatch),速度更快;不会调用 setter 方法,绕过了“内存管理语义”;不会触发“键值观测”(Key-Value Observing, KVO)通知。
  2. 属性访问优点:可以给 getter 和/或 setter 方法新增断点,便于查错。

一种合理的折中方案:写入实例变量时,通过“设置方法”;读取实例变量时,直接访问。
原因:既能提高读取操作的速度,又能控制对属性的写入操作。

惰性(延迟)实例化示例代码:

- (EOCBrain*)brain {
    if (!_brain) {
        _brain = [Brain new];
    }
    return _brain;
}

一些名词:
“键值观测”(Key-Value Observing, KVO)通知:一种通知机制,当某对象属性改变时,可通知其他对象。

主要来源:《Effective Objective-C 2.0》

相关文章

网友评论

      本文标题:第 7 条:在对象内部尽量直接访问实例变量

      本文链接:https://www.haomeiwen.com/subject/iqdzhttx.html