黑马程序员技术交流社区

标题: OC学习笔记之点语法的介绍和使用 [打印本页]

作者: chunhuayun    时间: 2015-10-5 15:13
标题: OC学习笔记之点语法的介绍和使用
1、使用
  1. #import <Foundation/Foundation.h>

  2. @interface Person : NSObject{
  3.     NSString *_name;
  4.     int _age;
  5. }
  6. //set方法
  7. -(void)setName:(NSString*)name;
  8. -(void)setAge:(int)age;
  9. //get方法
  10. -(NSString*)name;
  11. -(int)age;

  12. @end

  13. @implementation Person

  14. -(void)setAge:(int)age{
  15.     _age = age;
  16.     NSLog(@"调用了setAge方法");
  17. }
  18. -(void)setName:(NSString *)name{
  19.     _name = name;
  20.     NSLog(@"调用了setName方法");
  21. }

  22. -(int)age{
  23.      NSLog(@"调用了getAge方法");
  24.     return _age;
  25. }

  26. -(NSString *)name{
  27.      NSLog(@"调用了getName方法");
  28.     return _name;
  29. }
  30. @end
  31. int main(int argc, const char * argv[])
  32. {

  33.     @autoreleasepool {
  34.         
  35.         //使用传统set和get
  36.          NSLog(@"----------使用传统set和get----------");
  37.         Person *p = [Person new];
  38.         [p setName:@"Amos"];
  39.         [p setAge:23];
  40.         
  41.         NSString * name = [p name];
  42.         int age = [p age];
  43.         
  44.         NSLog(@"name  = %@, age = %d",name, age);
  45.         
  46.          NSLog(@"----------使用点语法-----------");
  47.         
  48.         //使用点语法
  49.         Person *p2 = [Person new];
  50.         //此处不是直接访问实例变量,而是Xcode遇到点语法出现在等号左侧,会自动把p2.name=@"Allen"替换成[p2 setName:@"Allen"];
  51.         p2.name = @"Allen";
  52.         p.age = 22;
  53.         //此处Xcode遇到点语法出现在等号右侧,会地总把p2.name替换成[p2 name]
  54.         NSLog(@"name  = %@, age = %d",p2.name, p2.age);
  55.         
  56.         //总结,Xcode把p2.name替换成set还是get取决于该点语法出现在等号的左侧还是右侧
  57.     }
  58.     return 0;
  59. }
复制代码



打印结果:

2015-10-05 08:20:56.757 Day20[565:303]----------使用传统set和get----------
2015-10-05 08:20:56.759 Day20[565:303] 调用了setName方法
2015-10-05 08:20:56.760 Day20[565:303] 调用了setAge方法
2015-10-05 08:20:56.760 Day20[565:303] 调用了getName方法
2015-10-05 08:20:56.761 Day20[565:303] 调用了getAge方法
2015-10-05 08:20:56.761 Day20[565:303] name  = Amos, age = 23
2015-10-05 08:20:56.762 Day20[565:303]----------使用点语法-----------
2015-10-05 08:20:56.762 Day20[565:303] 调用了setName方法
2015-10-05 08:20:56.763 Day20[565:303] 调用了setAge方法
2015-10-05 08:20:56.763 Day20[565:303] 调用了getName方法
2015-10-05 08:20:56.763 Day20[565:303] 调用了getAge方法
2015-10-05 08:20:56.764 Day20[565:303] name  = Allen, age = 0


2、注意事项
1)set死循环
  1. -(void)setAge:(int)age{
  2.     self.age = age;
  3. }
复制代码


这样会自身调用自身,陷入死循环,相当于
  1. -(void)setAge:(int)age{
  2.     [self setAge:age];
  3. }
复制代码


2)get死循环
  1. -(int)age{
  2.     return self.age;
  3. }
复制代码


这样也是死循环相当于
  1. -(int)age{
  2.     return [self age];
  3. }
复制代码



3、点语法的本质
是方法的调用,而不是直接访问实例变量,如果没有声明定义对应的set和get方法,就会报错了


作者: 超の    时间: 2015-10-5 18:14
支持一下!




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