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;
@end

    
int 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的_开头的成员变量

*/

你可能感兴趣的:(note)