(0) 会不会死循环,把点符号,变成[]就可以了,比如重写set方法时候,self.name = name,变成[ self setName:name], 这样每次运行到 setName这个地方就会循环调用setName方法。。。就死循环了。。。
再比如 重写get方法,有个比较 if(self.name)。。。。写成 if([self name])... 每次运行到这个地方, 都会调用name这个方法,这样就死循环了。
(1)用@property修饰的属性(例如name), 自动有了getter和setter方法, 当重写其中之一的时候,会自动生成一个_name变量。
(2)重写其中一个方法的时候(例如getter方法),使用 if(self.name == nil)这种判断语句,self.name默认调用getter方法,因为判断语句本身就是两步 X = self.name (这个就是用getter方法)和 x ? nil,这个时候就会循环调用getter方法了,每次到判断的地方 就会调用这个正在重写的name方法。所以如果想作判断用_name == nil就不会循环调用getter方法了。
如果不是判断语句之类的获取数据方法(return 也是这个意思 return self.name 也是会调用getter方法,应该返回 return _name 和),,赋值调用self.name = @"xxx",也会循环调setter方法,,用 _name = @"xxx";赋值,这样才能避免循环。
(3)如果重写两个方法,_xxx就没有了,用@synthesize name = xxx;自己定义一个参数。
(4) self.xxx 和 _xxx是一个地址,所以改变_xxx或者返回_xxx估计能达到和想要的返回self.xxx一样的效果吧
反正避免在@property的getter和setter方法里,使用self.xxx作赋值或者判断,容易出现循环。
++++++++++++++++++
- (NSString *)name{
if (_name != nil) {
self.name = @"hhhhh"; //这个地方可以用self.xxx = ...
// 前提是setter方法不出现循环问题
}
printf("+++++get++++++\n");
return _name ;
}