之前一直以为set方法就是为了,让外部调用提供外部接口用的,不过在最近沃尔玛项目中,我发现我错了,我错得特别离谱,以至于不仔细看我都被蒙过去了。
首先我们明确一点set方法,如果我们不自定义set方法,那么我们属性会自动实现set和get方法而且注意而且会生成实例变量
like:@property(nonatomic,weak) Nsstring *name;
那么系统会自动生成_name的实例变量。
那如果我们自定义是实现了set方法的话,你就别想用_name了,你不许手动在扩展里面添加一个_name的实例变量,否则就休想使用,注意不会自动生成了!
所以 我当初遇到这样一段代码
在一个
- (void)setItemsList方法里面
得到:
self.brandList = brands;
而且我自定义类里面有自定义实现set方法
- (void)setBrandList:(NSArray *)brandList
通过断点跟踪,发现当代码运行到self.brandList = brands时候
会自动跳入- (void)setBrandList:(NSArray *)brandList方法
而- (void)setBrandList:(NSArray *)brandList这个方法里面有一个
_brandList = brandList;
注意这个_brandlist就是作者自定义的一个实例变量。不是系统自己生成的。所以依次来说总结两点:
1.自定义set方法之后,没有办法使用到实例变量,只能手动添加
2.在我们这个自定义类里面同样可以用set方法来对属性进行逻辑处理,而且可以不给外面使用,单单set方法就给自定义里面使用。(我这个重写set的属性就是没有给外部使用)