IOS第十天——Obj-C的属性

今天我们就主要来学习一下Obj-C的属性,那么我想有过面向对象编程经验的人都知道,在OOP(面向对象编程)中,数据是被封装在对象内部,一个对象访问另一个成员变量的时候需要通过特定的接口(getter取值,setter赋值)。从书上了解到属性是Obj-C2.0的版本才引入的一个概念,是一种新的特性,介于实力变量和方法之间,可以帮助我们实现getter和setter。那么我们来看下Obj-C中属性的声明格式:

@property (修饰) 类型 名字

实现的语法如下:

@synthesize 属性名称

其中修饰的类型有以下几种:

  • Readwrite表示变量可读写
  • Readonly表示变量只读,需要手动添加setter函数
  • Assign表示变量可直接赋值,内存引用技术值不变
  • Retain表示对对象进行一次引用,内存技术值+1
  • Copy表示复制一个新对象,新对象的内存引用技术值为1
  • Nonatomic非原子操作属性,修饰默认是atomic,在多线程的时候变量互斥的特点

那么我们来定义过一个学生类,变量主要哟学生名字、ID、地址和描述,这些都是一个学生的属性,原始的定义如下:

[cpp]  view plain copy
  1. @interface Stdent:NSObject  
  2. {  
  3.     NSString *Name;//类的成员变量  
  4.     NSString *Address;  
  5.     Int ID;  
  6. }  
  7. +(void)student;  
  8. -(NSString*)Name;  
  9. -(NSString*)setName;(NSString *)aValue;  
  10. -(NSString*)Address;  
  11. -(NSString*)setAddress;(NSString *)aValue;  
  12. -(NSString*)ID;  
  13. -(int*)setID;(int *)aValue;  
  14. -(NSString*)smmary;  
  15. @end  

如果我们使用Obj-C2.0的属性功能的话,上面的代码就会变成下面的样子:

[cpp]  view plain copy
  1. //采用Obj-C2.0语法的类定义  
  2. @interface Student:NSObject  
  3. {  
  4.     NSString *Name;  
  5.     NSString *Address;  
  6.     Int ID;  
  7. }  
  8. +(id)student;  
  9. @property(copy, nonatomic) NSString *Name;//声明属性Name,设置该属性的时候采用复制的行为  
  10. @property(retain, nonatomic) NSString *Address;//声明属性Address,设置该属性的时候采用引用行为计数加1的行为  
  11. @property(assign, nonatomic) NSInteger *ID;//声明属性ID,设置该属性的时候采用直接赋值的行为  
  12. @end  

那么我们来看一下第一种写法的接口的实现代码:

[cpp]  view plain copy
  1. //第一种写法的实现  
  2. @implementation Student  
  3. +(id)student  
  4. {  
  5.     Return [[[Student alloc] init] autorelease];  
  6. }  
  7. -(NSString *)Name  
  8. {  
  9.     Return Name;  
  10. }  
  11. -(NSString *)setName;(NSString *)aValue  
  12. {  
  13.     [Name autorelease];  
  14.     Name=[aValue copy];  
  15. }  
  16. -(NSString *) Address  
  17. {  
  18.     Return Address;  
  19. }  
  20. -(void)setAddress;(NSString *) aValue  
  21. {  
  22.     [Address autorelease];  
  23.     Address=[aValue retain];  
  24. }  
  25. -(NSInteger *) ID  
  26. {  
  27.     Return ID;  
  28. }  
  29. -(NSString *)setID;(NSString *)aValue  
  30. {  
  31.     ID=aValue;  
  32. }  
  33. -(NSString *)summary  
  34. {  
  35.     NSNumber *Idb=[NSNumber numberWithInt:[self ID];  
  36.     Return [NSString stringWithFormat:@"Name:%@--Address:%@--ID:%@",self.Name,slef.Address,self.Address.Idb];  
  37. }  
  38. @end  

接下来我们再把实现部分换成Obj2.0的写法

[cpp]  view plain copy
  1. //第二种写法  
  2. @implementation Student  
  3. @synthesize Name;  
  4. @synthesize Address;  
  5. @synthesize ID;  
  6. +(id)student  
  7. {  
  8.     Return [[Student alloc] init];  
  9. }  
  10. -(NSString *)summary  
  11. {  
  12.     NSNumber *Idb=[NSNumber numberWithInt:[self ID]];  
  13.     Return [NSString stringWithFormat:@"Name:%@--Address:%@--ID:%@",self.Name,self.Address,Idb];  
  14. }  
那么@synthesize指令生成了相应的方法,由于Obj-C2.0采用了垃圾回收机制,因此student不需要autorelease,同时[self Name]和[self Address]被self.Name和self.Address替换了。

OK,昨晚由于加班整理一个文档,所以没有来得及学习,所以今天都学习一些,马上下班回家再学。

2013年04月23日,Eric.Tang 记

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值