今天我们就主要来学习一下Obj-C的属性,那么我想有过面向对象编程经验的人都知道,在OOP(面向对象编程)中,数据是被封装在对象内部,一个对象访问另一个成员变量的时候需要通过特定的接口(getter取值,setter赋值)。从书上了解到属性是Obj-C2.0的版本才引入的一个概念,是一种新的特性,介于实力变量和方法之间,可以帮助我们实现getter和setter。那么我们来看下Obj-C中属性的声明格式:
@property (修饰) 类型 名字
实现的语法如下:
@synthesize 属性名称
其中修饰的类型有以下几种:
那么我们来定义过一个学生类,变量主要哟学生名字、ID、地址和描述,这些都是一个学生的属性,原始的定义如下:
@interface Stdent:NSObject { NSString *Name;//类的成员变量 NSString *Address; Int ID; } +(void)student; -(NSString*)Name; -(NSString*)setName;(NSString *)aValue; -(NSString*)Address; -(NSString*)setAddress;(NSString *)aValue; -(NSString*)ID; -(int*)setID;(int *)aValue; -(NSString*)smmary; @end
//采用Obj-C2.0语法的类定义 @interface Student:NSObject { NSString *Name; NSString *Address; Int ID; } +(id)student; @property(copy, nonatomic) NSString *Name;//声明属性Name,设置该属性的时候采用复制的行为 @property(retain, nonatomic) NSString *Address;//声明属性Address,设置该属性的时候采用引用行为计数加1的行为 @property(assign, nonatomic) NSInteger *ID;//声明属性ID,设置该属性的时候采用直接赋值的行为 @end
//第一种写法的实现 @implementation Student +(id)student { Return [[[Student alloc] init] autorelease]; } -(NSString *)Name { Return Name; } -(NSString *)setName;(NSString *)aValue { [Name autorelease]; Name=[aValue copy]; } -(NSString *) Address { Return Address; } -(void)setAddress;(NSString *) aValue { [Address autorelease]; Address=[aValue retain]; } -(NSInteger *) ID { Return ID; } -(NSString *)setID;(NSString *)aValue { ID=aValue; } -(NSString *)summary { NSNumber *Idb=[NSNumber numberWithInt:[self ID]; Return [NSString stringWithFormat:@"Name:%@--Address:%@--ID:%@",self.Name,slef.Address,self.Address.Idb]; } @end
//第二种写法 @implementation Student @synthesize Name; @synthesize Address; @synthesize ID; +(id)student { Return [[Student alloc] init]; } -(NSString *)summary { NSNumber *Idb=[NSNumber numberWithInt:[self ID]]; Return [NSString stringWithFormat:@"Name:%@--Address:%@--ID:%@",self.Name,self.Address,Idb]; }那么@synthesize指令生成了相应的方法,由于Obj-C2.0采用了垃圾回收机制,因此student不需要autorelease,同时[self Name]和[self Address]被self.Name和self.Address替换了。
OK,昨晚由于加班整理一个文档,所以没有来得及学习,所以今天都学习一些,马上下班回家再学。
2013年04月23日,Eric.Tang 记