OC学习笔记03-OC中访问修饰符,点语法与@property,@synthesize关键字

#import @interface Person : NSObject { NSString * _name; //interface中无修饰默认protected @protected int _age,_height; @private double _weight; @package BOOL _isAlive; }@property NSString name; //生成getter和setter的声明 @property int age,height; //同种类型可以写一起,同样是分别生成 @property double weight; @property BOOL isAlive; @end@implementation Person - (void)setName:(NSString*)name { NSLog(@"set name"); _name=name; } //若setter,getter有部分实现,只生成未实现部分 @synthesize name = _name; //也可以用,分隔写一行,生成时同样是一个一个生成getter和setter @synthesize age=_age , height=_height , weight=_weight , isAlive=_isAlive; @end//子类继承父类所有成员及方法,虽然子类中无法直接访问父类private成员 //但子类仍然拥有该成员 @interface Staff : Person { @public NSString * _nickname; }//Xcode4.4后,@property也包含了原本@synthesize的功能 //生成getter与setter的声明及实现,若无此成员变量,还默认生成private的以_开头的成员变量 @property double salary; @property NSString *position; @end@implementation Staff { double _salary; //implementation中声明的默认为private @public int _staffNo; }//若无声明此成员,则自动生成 @synthesize position=_position; @endint main(int argc, const char * argv[]) {Staff *staff=[Staff new]; [staff setName:@"Johnny"]; [staff setSalary:200.0]; [staff setIsAlive:YES]; //NSString 创建方式之一 NSString *str=[NSString stringWithFormat:@"my name is %@ and my salary is %.2f ",[staff name],[staff salary]]; NSLog(str); // OC中的点语法,点语法本质是调用getter或setter,编译器碰到点语法,自动根据是否赋值转换成相应的getter或setter staff.name=@"Bale"; //等价于[staff setName:@"Bale"]; staff.position=@"manager"; NSString *str2=[NSString stringWithFormat: @"my name is %@ and my salary is %.2f ", staff.name,staff.salary]; //等价于[staff salary] NSLog(str2); } /* OC中的访问修饰符: @public公用的,都可直接访问 @protected本类与其子类中可直接访问 @private只能被本类中对象方法直接访问 @package 同一框架中可直接访问,非同一框架中无法直接访问在interface中声明的成员变量默认是protected 在implementation中声明的成员变量,默认是private(在没被他人import的情况下,即使加@public仍然无法被他人引用)关键字@property与@synthesize @property用于生成getter与setter的声明,只能用于interface中例:@property NSString * name @synthesize 用于生成getter与setter的实现,只能用于implementation中例:@synthesize name = _name (若无_name的成员变量,则自动生成private 的_name成员变量) 生成的getter和setter会根据代码中的getter,setter实现情况和成员变量定义情况动态生成缺少的部分,即 若getter或setter已经有实现或声明则只生成没实现或没声明的那部分,若有自动生成getter或setter的实现而且 成员变量未定义,则自动生成private的_开头的成员变量*/


    推荐阅读