黑马程序员技术交流社区

标题: 关于OC中的点语法和self语法 [打印本页]

作者: jingkai    时间: 2015-5-13 18:22
标题: 关于OC中的点语法和self语法
比如 有一个person类
@implementation Person
{
    int _age;
}
@property int age;


- (void)setAge:(int)age
{
    self.age = age;
}
- (int)age
{
    return self.age;
}
如上 self表示对象本身
那么 根据self.age就是访问对象的_age变量。
self.age=age;就等于_age=age;
return self.age 就等于 return _age;
可是为什么老师说会引发死循环呢

作者: xiaofei93    时间: 2015-5-13 22:05
首先点方法是方法调用,set方法中self.age 就等同于调用setAge方法,然后进入之后再调用,就是死循环了;age方法中self.age是调用age方法,然后再返回再调用就是死循环了
作者: jingkai    时间: 2015-5-14 08:50
xiaofei93 发表于 2015-5-13 22:05
首先点方法是方法调用,set方法中self.age 就等同于调用setAge方法,然后进入之后再调用,就是死循环了;ag ...

你的意思是 self.age即代表get方法也代表set方法?
怎么区分呢?
作者: unnamed    时间: 2015-5-14 16:37
self.age进行赋值操作(self.age = age)代表调用self的setAge方法,self.age不进行赋值操作(self.age)代表调用self这个类的getAge方法。
上面代码在setAge方法中写self.age = age,进行了赋值操作,那么就会调用setAge方法,等于又回到了setAge方法中去,又执行写self.age = age,又回到setAge中,即死循环。
同理getAge方法中也一样。
self:谁调用就是谁,可能是对象或者类 在你上面的代码中这里的self可能是Person对象或者Person的子类的对象。
这么解释希望你能明白(类的实现中一般不定义变量)
作者: cogddo    时间: 2015-5-14 16:43
jingkai 发表于 2015-5-14 08:50
你的意思是 self.age即代表get方法也代表set方法?
怎么区分呢?

确实是,怎么区分。。。那就看后面有没有赋值了,如果赋值就是set,如果没赋值就是get
作者: 狂甩你十八条街    时间: 2015-5-14 18:37
问题在这里,
- (void)setAgeint)age
{
    self.age = age;
}
当程序执行道这里时,set方法就是给age赋值,进入set方法后,self.age又调用set方法,这样就死循环了,个人理解,如有问题,还望指正。
作者: xiaofei93    时间: 2015-5-14 23:22
jingkai 发表于 2015-5-14 08:50
你的意思是 self.age即代表get方法也代表set方法?
怎么区分呢?

如果self.age后面有值就代表是set方法,如果后面没有值就代表get方法




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2