黑马程序员技术交流社区

标题: 点语法的问题 [打印本页]

作者: 程序猿-2014    时间: 2014-4-10 19:08
标题: 点语法的问题
本帖最后由 程序猿-2014 于 2014-4-11 14:35 编辑

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    int _age;
}
- (void)setAge: (int)age;
- (int)age;
@end

@implementation Person
{
    int _age;
}
- (void)setAge: (int)age
{
    self.age = age
}
- (int)age
{
    return _age;
}
@end
如题:题中的下划线中得self.age内存中得表现形式是什么啊   


作者: 周宇华    时间: 2014-4-10 19:19
self.age = age; // 相当于[self setAge:age];
按你这样的写法会造成无限循环。
点语法基本法则:在等号左边是set方法,在等号右边是get方法。
作者: 1722413885    时间: 2014-4-10 19:31
这样写的话,会引起死循环

猎豹截图20140410192941.png (127.83 KB, 下载次数: 23)

猎豹截图20140410192941.png

作者: 啊康    时间: 2014-4-10 19:37
self.age = age;指的是将传进来的参数赋值给调用该函数所对应的对象的成员变量age,
在内存中的表现形式是,先是在堆内存中创建一个该类对象,然后该类对象调用自身的set函数
,并且同时传入形参的具体数值,set函数中执行self.age = age;是将传进来的参数赋值给自身的
成员变量,这个是点方法的运用,其实也可以写成  _age = age;意思是相同的!
作者: 于清扬    时间: 2014-4-11 14:18
  1. #import "Person.h"

  2. @implementation Person

  3. - (void)setAge: (int)age
  4. {
  5.     /** 点语法是编译器特性,只是编译器会自动把self.age = age 转成
  6.      [self setAge:age];
  7.      所以这样会引发死循环。
  8.      */
  9.     self.age = age;
  10. }
  11. - (int)age
  12. {
  13.     /**
  14.      同理,如果在这里使用点语法 return self.age;也会引发死循环
  15.      编译器会把self.age 转成[self age];
  16.      */
  17.     return _age;
  18. }
  19. @end
复制代码





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