@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成员变量。