黑马程序员----OC学习之成员变量的get,set方法多种实现

本文主要纪录oc类对象中成员变量的get set方法的多种实现,涉及到一般的getset编写,@property @synthesize以及缺省部分代码时的各种特性。

下面是最基本的get set写法,以Person类为例。

Person.h文件:

[objc]  view plain copy
  1. #import <Foundation/Foundation.h>  
  2. @interface Person : NSObject  
  3. {  
  4. @private  
  5.     NSString * _name;  
  6.     int _age;  
  7. }  
  8. //get方法  
  9. - (NSString *) name;  
  10. - (int) age;  
  11. //set方法  
  12. - (void) setName:(NSString *)name;  
  13. - (void) setAge:(int)age;  
  14.   
  15. @end  

Person.m文件:

[objc]  view plain copy
  1. #import "Person.h"  
  2.   
  3. @implementation Person  
  4. //get方法实现  
  5. - (NSString *)name{  
  6.     return _name;  
  7. }  
  8. - (int)age{  
  9.     return _age;  
  10. }  
  11. //set方法实现  
  12. - (void)setName:(NSString *)name{  
  13.     _name = name;  
  14. }  
  15. - (void)setAge:(int)age{  
  16.     _age = age;  
  17. }  
  18. @end  

main.m文件中:

[objc]  view plain copy
  1. #import <Foundation/Foundation.h>  
  2. #import "Person.h"  
  3. int main() {  
  4.     Person *p1 = [[Person alloc] init];  
  5.       
  6.     [p1 setName:@"小红"];  
  7.     [p1 setAge:13];  
  8.       
  9.     NSLog(@"name=%@,age=%d",[p1 name],[p1 age]);  
  10.     return 0;  
  11. }  

最后输出结果为:

2014-12-17 12:02:37.674ocblog4[472:14456] name=小红,age=13

如上是最基本的对类成员变量的get set方法编写。

对于set方法:

1.     用来设置变量的值,也可以起到过滤不合法数据的作用。

2.     方法以set开头,后面跟上首字母大写的成员变量名,而且注意形参名不要和成员变量名相同。

对于get方法:

1.     作用就是返回成员变量的值。

2.     一般在oc中,get方法名就和成员变量名一样,比如变量 int _age;的get方法名可以写为 –(void) age;

oc中为了好区分成员变量和一般变量,一般规定在成员变量名前加上”_”,如”_age”以示区别。

 

如上是最基本的get set方法的编写,但是却非常麻烦,oc于是推出了一个新的编译器特性,加入了@property和 @synthesize来让get set方法变简单。

加入@property @synthesize后的写法如下:

Person2.h文件

[objc]  view plain copy
  1. #import <Foundation/Foundation.h>  
  2. @interface Person2 : NSObject  
  3. {  
  4. @private  
  5.     NSString *_name;  
  6.     int _age;  
  7. }  
  8. @property NSString *name ;  
  9. @property int age;  
  10. @end  

Person2.m文件中:

[objc]  view plain copy
  1. #import "Person2.h"  
  2. @implementation Person2  
  3. @synthesize name = _name;  
  4. @synthesize age = _age;  
  5. @end  

可以看到@property取代了get set方法的声明,@synthesize取代了get set方法的实现,节省了代码。但这还不是最简,如上代码还可以写成如下,以Person3为例。

Person3.h文件:

[objc]  view plain copy
  1. #import <Foundation/Foundation.h>  
  2. @interface Person3 : NSObject  
  3. @property NSString *name;  
  4. @property int age;  
  5. @end  

Person3.m文件:

[objc]  view plain copy
  1. #import "Person3.h"  
  2. @implementation Person3   
  3. //这里没有@synthesize也可以,@property在xcode4.x的某个版本后也可以生成get set方法的实现了。  
  4. @end  

这样就完成了一个类 Person3  的编写,同时声明了@private作用域的成员变量_name 和 _age。

可以总结出@property @synthesize的作用如下:

@property

1.      形式如@property NSString *name; 必须写在@implementation和@end之间。

2.     作为编译器特性取代了传统的get set 方法的声明。

3.     当缺省了显示的成员变量定义和@synthesize语句时甚至可以自动声明成员变量和成员变量的get set方法的声明和实现,这种情况下声明的变量作用域是@private,变量名是自动加了下划线”_”的形式。

@synthesize

1.             形式如@synthesize name = _name;其中name是@property声明的变量,_name是真正的成员变量。

2.             作为编译器的特性取代了传统的get set方法的实现。

3.             如果写成@synthesize name;那么默认生成的变量名就是name了,一般不这么写。

 

@property和@synthesize让代码变得更为简洁了,同时@property还有其他功能,可以加入nonatomic retain readonly…等特性,不过这写是在学了内存管理后才涉及的范围。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值