黑马程序员技术交流社区

标题: OC学习笔记03-OC中访问修饰符,点语法与@property,@synthesize关键字 [打印本页]

作者: wowthe1st    时间: 2015-7-29 22:36
标题: OC学习笔记03-OC中访问修饰符,点语法与@property,@synthesize关键字
适合有java基础的同学迅速了解OC,个人喜好用代码来记笔记,看起来直观形象;

  1. #import <Foundation/Foundation.h>

  2. @interface Person : NSObject
  3. {
  4.         NSString * _name;//interface中无修饰默认protected
  5.         @protected
  6.         int _age,_height;
  7.         @private
  8.         double _weight;
  9.         @package
  10.         BOOL _isAlive;
  11. }

  12. @property NSString name;//生成getter和setter的声明
  13. @property int age,height;//同种类型可以写一起,同样是分别生成
  14. @property double weight;
  15. @property BOOL isAlive;

  16. @end

  17. @implementation Person
  18. - (void)setName:(NSString*)name
  19. {
  20.         NSLog(@"set name");
  21.         _name=name;
  22. }
  23. //若setter,getter有部分实现,只生成未实现部分
  24. @synthesize name = _name;
  25. //也可以用,分隔写一行,生成时同样是一个一个生成getter和setter
  26. @synthesize age=_age , height=_height , weight=_weight , isAlive=_isAlive;
  27. @end

  28. //子类继承父类所有成员及方法,虽然子类中无法直接访问父类private成员
  29. //但子类仍然拥有该成员
  30. @interface Staff : Person
  31. {
  32.         @public
  33.         NSString * _nickname;
  34.        
  35. }

  36. //Xcode4.4后,@property也包含了原本@synthesize的功能
  37. //生成getter与setter的声明及实现,若无此成员变量,还默认生成private的以_开头的成员变量
  38. @property double salary;

  39. @property NSString *position;
  40. @end

  41. @implementation Staff
  42. {
  43.         double _salary;//implementation中声明的默认为private
  44.        
  45.         @public
  46.         int _staffNo;
  47. }

  48. //若无声明此成员,则自动生成
  49. @synthesize position=_position;
  50. @end

  51.    
  52. int main(int argc, const char * argv[])  
  53. {        
  54.      
  55.      Staff *staff=[Staff new];
  56.      [staff setName:@"Johnny"];
  57.      [staff setSalary:200.0];
  58.      [staff setIsAlive:YES];
  59.      //NSString 创建方式之一
  60.      NSString *str=[NSString stringWithFormat:@"my name is %@ and my salary is %.2f ",[staff name],[staff salary]];
  61.      NSLog(str);
  62.      
  63.      // OC中的点语法,点语法本质是调用getter或setter,编译器碰到点语法,自动根据是否赋值转换成相应的getter或setter
  64.      staff.name=@"Bale";//等价于[staff setName:@"Bale"];
  65.      staff.position=@"manager";
  66.      NSString *str2=[NSString stringWithFormat:
  67.      @"my name is %@ and my salary is %.2f ",
  68.      staff.name,staff.salary]; //等价于[staff salary]
  69.      NSLog(str2);
  70. }


  71. /*
  72. OC中的访问修饰符:
  73. @public     公用的,都可直接访问
  74. @protected  本类与其子类中可直接访问
  75. @private    只能被本类中对象方法直接访问
  76. @package 同一框架中可直接访问,非同一框架中无法直接访问

  77. 在interface中声明的成员变量默认是protected
  78. 在implementation中声明的成员变量,默认是private(在没被他人import的情况下,即使加@public仍然无法被他人引用)

  79. 关键字@property与@synthesize
  80. @property  用于生成getter与setter的声明,只能用于interface中    例:@property NSString * name
  81. @synthesize 用于生成getter与setter的实现,只能用于implementation中  例:@synthesize name = _name (若无_name的成员变量,则自动生成private 的_name成员变量)
  82. 生成的getter和setter会根据代码中的getter,setter实现情况和成员变量定义情况动态生成缺少的部分,即
  83. 若getter或setter已经有实现或声明则只生成没实现或没声明的那部分,若有自动生成getter或setter的实现而且
  84. 成员变量未定义,则自动生成private的_开头的成员变量

  85. */
复制代码





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