self.xxx和_xxx

(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 ;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值