IOS第十天——Obj-C的属性
2013-04-23 18:08
253 查看
今天我们就主要来学习一下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、地址和描述,这些都是一个学生的属性,原始的定义如下:
@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的属性功能的话,上面的代码就会变成下面的样子:
//采用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
接下来我们再把实现部分换成Obj2.0的写法
//第二种写法
@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 记
@property (修饰) 类型 名字
实现的语法如下:
@synthesize 属性名称
其中修饰的类型有以下几种:
Readwrite表示变量可读写
Readonly表示变量只读,需要手动添加setter函数
Assign表示变量可直接赋值,内存引用技术值不变
Retain表示对对象进行一次引用,内存技术值+1
Copy表示复制一个新对象,新对象的内存引用技术值为1
Nonatomic非原子操作属性,修饰默认是atomic,在多线程的时候变量互斥的特点
那么我们来定义过一个学生类,变量主要哟学生名字、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的属性功能的话,上面的代码就会变成下面的样子:
//采用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
接下来我们再把实现部分换成Obj2.0的写法
//第二种写法
@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 记
相关文章推荐
- IOS第十天——Obj-C的属性
- IOS第十天——Obj-C的属性
- iOS在分类中添加属性,运行时编程,objc runtime 动态增加属性
- ios专题 - objc runtime 动态增加属性
- ios获取类的属性,获取CLPlacemark类所有属性,Declaration of 'objc_property_t' must be imported from module 'objecti
- ios runtime 动态属性objc_setAssociatedObject和objc_getAssociatedObject
- 如何应用autosizing属性使iOS应用程序界面适配iPhone5
- iOS objc_msgSend 报错解决方案
- IOS-为什么很多内置类如UITableViewController的delegate属性都是assign而不是retain的?
- iOS 获取对象的全部属性、把model的所有属性和对应的值转化为字典
- iOS开发中@property的属性weak nonatomic strong readonly等介绍
- iOS开发之translucent属性
- ios项目属性以及sb的初步认识
- ios深度解析之Swift(结构体和类,属性)
- iOS中OC给Category添加属性
- IOS开发UI基础 UIAlertView的属性
- iOS错误:duplicate symbol _OBJC_METACLASS_$_ClassName
- ios 项目中的全局、局部、成员、属性变量
- ios app开发属性设置基础教程
- IOS小技巧——使用FMDB时如何把一个对像中的NSArray数组属性存到表中