Item 7 访问数据`_`和`.`注意项

Item 7 访问数据_.注意项

access变量时的在内部直接访问的区别,先看一个例子:

//convience methods
- (NSString *) fullName {
  return [NSString stringWithFormat:@"%@%@", self.firstName,self.lastName];
}
- (void)setFullName:(NSString*)fullName{
  NSArray * components = [fullName componentsSeperatedByString:@""];
  self.firstName = [components objectAtIndex:0];
  self.lastName = [components objecteAtIndex:1];
}

上例中,我们通过accessor来access实例变量,用到了属性的.表达式,假设你这样重写这两个方法直接access实例变量

- (NSString *)fullName{
  return [NSString stringWithFormat:@"%@%@",_fistName,_lastName];
}
-(void) setFullName:(NSString *)fullName{
  NSArray * components = [fullName componentsSeperateByString:@" "];
  _firstName = [components objectAtIndex:0];
  _latsName = [components objectAtIndex:1];
}

俩中方法区别:

  1. 直接访问速度上肯定会快些,因为不需要调用oc方法

  2. 直接访问绕过了属性的setter内存管理语法,例如如果你的属性定义为copy,直接设置实例变量不会生成一个copy,新值被保留,旧值被释放掉

  3. KVO 通知不会失效, 还不懂KVO

  4. 通过accessor来access属性在调试时会容易些,可以直接设置setter getter 断点

在初始化方法中设置值时,通常应该使用直接access的方式, 假设EOCPerson有一个子类EOCSmithPerson, 子类可能重写setter方法:

- (void)setLastName:(NSString*)lastName{
  if(![lastName isEqualToString @"Smith"]) {
    [NSException raise:NSInvalidArgumentException format:@"Last name must be Smith"];
  }
  self.lastName = lastName;
}

基类EOCPerson可能会在默认的初始化方法中把lastName设置为空,如果通过setter方法设置的,那么会调用到子类的setter方法,并且抛出异常。当然,有些情况如实例变量在父类中声明的,你不能直接access到实例变量,你必须使用setter

在使用lazy 初始化时,则必须通过getter 来access变量,如果不通过getter,实例变量可能没有机会初始化。例如EOCPerson可能有一个属性brain,如果这个属性经常被访问到,但是设置值可能带来很重的开销,你可以在getter中延迟初始化这个值:

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

如果直接访问brain可能getter还没有调用,brain可能就还没设置好。

总结

  1. 建议内部访问时通过直接读取实例变量(以_方式访问),设置变量值时通过setter
  2. 在初始化方法和dealloc中,读写最好通过_方法
  3. 某些场景(如lazy)读数据建议通过getter方法
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,891评论 2 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,160评论 1 32
  • 早上语文课进行歇会语比赛,表现还不错。就是普通话退化好厉害。 中午不午觉完成了一幅画,下午的课‘幼儿急救’拿着一个...
    逆风追梦人阅读 133评论 0 0
  • 有这样一个人 其他人眼中的他也许平凡到平庸 可是对于我而言呀 他的每一张照片、每一句语音、 每一段文字、每一种心情...
    开开吧阅读 339评论 0 0
  • 今天睡到了十一点多才起来,好累啊。在哥哥这里,是我做饭,头晕,她们都不做饭。整得满头都是油,好想我们家男神。他在我...
    依米花Erin阅读 92评论 0 0