A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jingkai 中级黑马   /  2015-5-13 18:22  /  1141 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

比如 有一个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;
可是为什么老师说会引发死循环呢

6 个回复

倒序浏览
首先点方法是方法调用,set方法中self.age 就等同于调用setAge方法,然后进入之后再调用,就是死循环了;age方法中self.age是调用age方法,然后再返回再调用就是死循环了
回复 使用道具 举报
xiaofei93 发表于 2015-5-13 22:05
首先点方法是方法调用,set方法中self.age 就等同于调用setAge方法,然后进入之后再调用,就是死循环了;ag ...

你的意思是 self.age即代表get方法也代表set方法?
怎么区分呢?
回复 使用道具 举报
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的子类的对象。
这么解释希望你能明白(类的实现中一般不定义变量)
回复 使用道具 举报
jingkai 发表于 2015-5-14 08:50
你的意思是 self.age即代表get方法也代表set方法?
怎么区分呢?

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

如果self.age后面有值就代表是set方法,如果后面没有值就代表get方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马