只怪当时_.属性和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.属性。