@property、@synthesize与getter、setter之间的关系

一、getter与setter

1、getter与setter的一般写法

在Objective-C中setter没什么区别,不过getter的方法名缺少了get,因为get...在Objective-C有别的用处,所以getter直接写的就是成员变量名。

Person.h

 1 @interface Person : NSObject {
 2     // 声明成员变量age,默认为protected访问权限
 3     int age;
 4 }
 5 
 6 // 声明age的getter方法
 7 - (int)age;
 8 // 声明age的setter方法
 9 - (void)setAge:(int)newAge;
10 
11 @end

Person.m

 1 #import "Person.h"
 2 
 3 @implementation Person
 4 
 5 //定义age的getter方法
 6 - (int)age {
 7     return age;
 8 }
 9 //定义age的setter方法
10 - (void)setAge:(int)newAge {
11     age = newAge;
12 }
13 
14 @end

 2、getter和setter的一般调用方法

一般的调用方法,是传统的带中括号[ ]的调用方法。

1 Person *person = [[Person alloc] init];
2 [person setAge:18];
3 int age = [person age];

 3、getter和setter的点调用方法

1 person.age = 18;  //.调用出现在=号左边,相当于setter
2 int age = person.age;   //.调用出现在=号的右边,相当于getter
3 NSLog(@"%i",person.age);  //这也是getter,也就是有赋值行为的调用setter,否则调用getter

 二、@property与@synthesize

1、getter与setter的简便写法

每次要为一个属性写上getter和setter,不得不说十分麻烦,所以有了更简单的写法。

Person.h

1 @interface Person : NSObject
2 
3 // 声明age的getter、setter方法
4 @property int age;
5 // 相当于
6 // - (int)age;
7 // - (void)setAge:(int)newAge;
8  
9  @end

Person.m

 1 #import "Person.h"
 2   
 3 @implementation Person
 4  
 5 // 实现age的getter、setter方法
 6 // 默认会去访问跟age同名的成员变量
 7 // 如果找不到会自动生成protected权限的age成员变量
 8 @synthesize age;
 9 // 相当于
10 // - (int)age {
11 //     return age;
12 // }
13 // - (void)setAge:(int)newAge {
14 //     age = newAge;
15 // }
16   
17 @end

 

2、getter与setter的改进优化

上面getter的方法名和成员变量名一样,容易让人迷糊,所以可以这样优化。

Person.h

1 @interface Person : NSObject {
2     // 声明_age成员变量,可以省略不写,除非想改变_age的访问权限
3     int _age;
4 }
5  
6 // 声明age的getter、setter方法
7 @property int age;
8  
9 @end

Person.m

 1 #import "Person.h"
 2   
 3 @implementation Person
 4  
 5 // 实现age的getter、setter方法
 6 // 会去访问_age成员变量
 7 // 如果找不到会自动生成protected权限的_age成员变量
 8 @synthesize age=_age;
 9 // 相当于
10 // - (int)age {
11 //     return _age;
12 // }
13 // - (void)setAge:(int)newAge {
14 //     _age = newAge;
15 // }
16   
17 @end

注:在Xcode4.5的环境下,可以省略@synthesize,并且默认会去访问_age成员变量,如果找不到则自动生成_age成员变量。因此,最简洁的写法只需在.h文件中用@property声明即可。如果要在getter或setter方法里执行其他操作,就要自己实现getter或setter方法。如果自己实现了getter方法就不会自动生成_age成员变量,自己只实现setter方法并且不写@synthesize时仍会自动生成_age成员变量。

posted on 2013-04-27 17:32  蓝易  阅读(408)  评论(0编辑  收藏  举报