_.属性和self.属性,我遇到的那些坑

Posted steer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了_.属性和self.属性,我遇到的那些坑相关的知识,希望对你有一定的参考价值。

  只怪当时_.属性和self.属性当时没有研究透,所以为自己掉入坑里埋下了伏笔。下面从我的坑开始说起:

  我写了个懒加载,重写了一个数组属性的get方法,在get方法里面创建了一个数组来获取数据,那么调用这个属性的话,都是能得到数据的。怪自己为了省力加对于_.属性和self.属性理解不够,用了_.属性。然后程序运行发现数据获取不到,半天找不到原因,费了好长时间才发现错误点是在_.属性这里。用了_.属性它其实并没有调用属性的get方法,所以并没有获取数据。为了验证这个想法,写了下面的事例代码:

  

@property(nonatomic,strong) NSString * name;
@synthesize name = _name;
//重写set方法
-(void)setName:(NSString *)name{
     NSLog(@"1");
    _name =name;
}
//重写get方法
-(NSString *)name{
    NSLog(@"2");
    return _name;
}

 然后分别使用_.属性和self.属性:

1.使用_.属性

 _name = @"hello";
    NSString *a = nil;
    a = _name;
    

 发现上面并没有打印日志。 

2.使用self.属性

  self.name = @"hello";
    NSString *a = nil;
    a = self.name;

 有打印日志。

 

结论:使用self.属性底层会自动的调用getter方法或者setter方法,而_.属性则不会,所以用_.属性时程序执行的效率更高。而在需要使用setter或者getter的时候,则不应该去使用_.属性,而应该用self.属性。

 

以上是关于_.属性和self.属性,我遇到的那些坑的主要内容,如果未能解决你的问题,请参考以下文章

七夕节写那些结伴而行的特殊方法

python-类的封装(私有属性,私有方法)

python-类的封装(私有属性,私有方法)

关于我学XSS躺过的那些坑

20180727 (面向对象的属性 类方法和静态方法)

我遇到错误:AttributeError:'str'对象没有属性'isfloat'