黑马程序员---@property和@synthesize

来源:互联网 发布:mac文件夹权限设置 编辑:程序博客网 时间:2024/05/25 16:38

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———

@property :自动生成成员变量的setter和getter方法的声明,用在interface 中
格式 :@property 类型 名称 ;(此处名称为成员变量名,但是不要写下划线)
如:@property int age ;
编译器会按照这个格式转换为- (void)setAge:(int)age;  -(int)age;

@synthesize :自动生成成员变量的setter和getter方法的实现,用在implementation中
如:@synthesize age = _age ;
编译器会把这句代码自动转换为下面所示的代码:
{
_age=age;
}
- (int)age
{
return _age;
}
自动生成了_age的set和get方法的实现,并且访问_age;
所以说在只要像下面这样写:
{
int _age;
}
@property int age; // set和get方法的声明
@implementation Person
@synthesize age = _age;
就可以实现_age的set和get方法了
还可以简写:
简写1. 如果有两个成员变量都是int型的,那么就可以这样写:
@property int age,no; @synthesize age = _age , no = _no;
简写2. @synthesize speed =_speed,wheels =_wheels;
如果在interface中没有声明这两个成员变量,只有property,那么就会自动生成_speed的成员变量,并且是私有的。
简写3. 在xcode4.4以后只写@propertyint speed; 这么一句,实现中也不写什么就可以。
注意1:
@property int speed;这句话干了三件事。
1->.生成了一个private_speed成员变量。
2->.声明了_speedsettergetter方法。
3->.实现了_speedsetget方法
缺点是自动生成的下划线成员变量是私有的,如果想要子类对象方法可以访问的话还需手动写出成员变量,编译器在编译过程中发现有成员变量就不会自动生成
注意2:
如果直接写@synthesize speed;那么默认就是会访问和speed名字一模一样的成员变量,如果没有就生成privatespped成员变量
注意3:
如果同时实现了setget方法,那么编译器就不会生成下划线的成员变量了
如果手动生成了一个方法,那么编译器还是会生成下划线的成员变量
@synthesize的细节
1.@synthesize age=_age;
setter和getter实现中会访问成员变量_age
如果成员变量_age不存在,就会自动生成一个@private的成员变量_age
2.@synthesize age;
setter和getter实现中会访问成员变量age
如果成员变量age不存在,就会自动生成一个@private的成员变量age
手动实现
若手动实现了setter方法,编译器就只会自动生成getter方法
若手动实现了getter方法,编译器就只会自动生成setter方法
若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量 
即如果有手动实现的,那么就按照我们自己定义的,没有的程序会自动帮我们补齐
@property和@synthesize是帮助我们自动生成set和get方法的
- (void)setAge:(int)age
@interface Person : NSObject
//.m文件中

格式 :@synthesize  变量名 = 将要访问的成员变量名称 ;(此处变量名相当于方法声明中传的参数的名称)

0 0
原创粉丝点击