属性(@property)、@synthesize

先前我们学的实例变量是这样的

1 {
2     int _age;
3     int _height;
4     int age;
5 }    

后来学属性

1 @property int age;

看到@property 会自动编译生成某个成员变量的setter方法和getter方法的声明

1 - (void)setAge:(int) age;
2 - (int)age;

举例:

@property int _age;

就会编译生成

- (void)set_age:(int) age;

- (int)_age;

也就是说你怎么写实例变量就会怎么编译生成,为了生成标准的实例变量的setter方法和getter方法的声明,所以属性不要再加 _ 了,并且setAge大写

既然使用@property有了实例变量的setter方法和getter方法的声明,那么实现就是@synthesize property

1 // 后面要求写属性,明确要对哪个属性实现一下setter、getter方法
2 @synthesize age

看到@synthesize 会自动编译生成某个成员变量的setter方法和getter方法的实现

1 - (void)setAge:(int)age {
2   _age = age;  
3 }
4 
5 - (int)age {
6   return age;  
7 }

如果硬要去访问 _age 那个成员变量,就

@synthesize age = _age;

这样会自动生成age的setter方法和getter方法的实现,并且会去访问_age这个成员变量

注意:左边的age:要实现的是age的setter方法和getter方法

   右边的age:是在实现里去访问_age这个成员变量,所以这样就将属性和实例变量联系在一起了

   系统规定成员变量要加 _ 修饰

上面的@synthesize age;没写后面的成员变量,会默认访问age

此时:会自动访问_age这个成员变量,如果不存在,就会自动生成@private类型的_age实例变量,在延展中声明,是私有的

XCode4.n之后 @property 即生成声明有生成实现

1 @property int age;

属性是实例变量_age的一对setter、getter方法的声明和实现

默认情况下,setter、getter方法中的实现会去访问 _ 开头的实例变量

学到这里,就清楚了为什么一开始我们学的时候成员变量以 _ 开头,其实系统内部是这样的

原文地址:https://www.cnblogs.com/xs514521/p/5207621.html