先前我们学的实例变量是这样的
{
int _age;
int _height;
int age;
}
后来学属性
@property int age;
看到@property 会自动编译生成某个成员变量的setter方法和getter方法的声明
- (void)setAge:(int) age;
- (int)age;
举例:
@property int _age;
就会编译生成
- (void)set_age:(int) age;
- (int)_age;
也就是说你怎么写实例变量就会怎么编译生成,为了生成标准的实例变量的setter方法和getter方法的声明,所以属性不要再加 _ 了,并且setAge大写
既然使用@property有了实例变量的setter方法和getter方法的声明,那么实现就是@synthesize property
// 后面要求写属性,明确要对哪个属性实现一下setter、getter方法
@synthesize age
看到@synthesize 会自动编译生成某个成员变量的setter方法和getter方法的实现
- (void)setAge:(int)age {
_age = age;
} - (int)age {
return age;
}
如果硬要去访问 _age 那个成员变量,就
@synthesize age = _age;
这样会自动生成age的setter方法和getter方法的实现,并且会去访问_age这个成员变量
注意:左边的age:要实现的是age的setter方法和getter方法
右边的age:是在实现里去访问_age这个成员变量,所以这样就将属性和实例变量联系在一起了
系统规定成员变量要加 _ 修饰
上面的@synthesize age;没写后面的成员变量,会默认访问age
此时:会自动访问_age这个成员变量,如果不存在,就会自动生成@private类型的_age实例变量,在延展中声明,是私有的
XCode4.n之后 @property 即生成声明有生成实现
@property int age;
属性是实例变量_age的一对setter、getter方法的声明和实现
默认情况下,setter、getter方法中的实现会去访问 _ 开头的实例变量
学到这里,就清楚了为什么一开始我们学的时候成员变量以 _ 开头,其实系统内部是这样的