@property和@synthesize
前面说过了setter和getter的写法,以及成员变量的声明和控制符等下面说下@property和@synthesize。作用是:让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明,简化代码。
如前面文章中的.h文件示例:
@interface Student : NSObject {
int _age;
int _no;
float _height;
}
上面是成员变量的声明,对应的有getter、setter声明如下:
//- (void)setAge:(int)newAge;
//- (int)age;
//- (void)setNo:(int)newNo;
//- (int)no;
//- (void)setHeight:(float)newHeight;
//- (float)height;
上面的方法可以使用如下方式取代:
// 当编译器遇到@property时,会自动展开成getter和setter的声明
@property int age;
@property int no;
@property float height;
如前面文章中的.m文件中setter、getter方法实现部分示例:
- (void)setAge:(int)age {
_age = age;
}
- (void)setNo:(int)no {
_no = no;
}
- (void)setHeight:(float)newHeight {
_height = newHeight;
}
- (int)age {
return _age;
}
- (int)no {
return _no;
}
- (float)height {
return _height;
}
上面的写法可以用如下方式代替:
// @synthesize age, height, no;
// @synthesize会自动生成getter和setter的实现
// @synthesize默认会去访问跟age同名的变量
// 如果找不到同名的变量,会自动生成一个私有的同名变量age
// @synthesize age;
// age = _age代表getter和setter会去访问_age这个成员变量
@synthesize age = _age;
//- (void)setAge:(int)newAge {
// _age = newAge;
//}
//- (int)age {
// return _age;
//}
@synthesize height = _height;
//- (void)setHeight:(float)newHeight {
// _height = newHeight;
//}
//- (float)height {
// return _height;
//}
@synthesize no = _no;
//- (void)setNo:(int)newNo {
// _no = newNo;
//}
//- (int)no {
// return _no;
//}
值得注意的是:
// 在xcode4.5的环境下,可以省略@synthesize,并且默认会去访问_age这个成员变量
// 如果找不到_age这个成员变量,会自动生成一个叫做_age的私有成员变量
只需要在.h中使用
@property int age;
即可实现成员变量声明和setter、getter方法的生成,但是注意只能生成默认的,如果自己要写初始化等实现还是得自己写。
说明:
// @proerty 不能删,@synthesize可以删除
// @proerty 和synthesize 是编译器的特性,可以使用原来方式实现
// 标准方法实现形式和@形式 可以交叉使用。
// 在Xcode4.5以后的环境下,可以省略@synthesize ,
// 并且默认去访问_age这个成员变量
// 如果没有在@interface中声明成员变量,即找不到_age,
// 则自动生成私有的_property变量。
@synthesize Height;
// 标准方法实现形式和@形式 可以交叉使用。
// 在需要转换等处理时候,则使用自己的setProperty方法
// 如果我们写了自己的实现,@synthesize则不会生成,少一个生一个。
// 用@synthesize来进行方法实现。只用于@implementation文件
// @synthesize age,no,_no;
// @synthesize 默认会去访问跟age 同名的变量
// 如果找不到同名的变量,会自动生成一个私有的同名成员变量。
// 如果在@interface中不写成员变量及@property ,只写@synthesize age;就是私有的
// @synthesize age=_age;
// age=_age;代表getter和setter会去访问_age这个成员变量