IOS第十天——Obj-C的属性
来源:互联网 发布:vue 页面初始化数据 编辑:程序博客网 时间:2024/05/06 02:20
今天我们就主要来学习一下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 记
- IOS第十天——Obj-C的属性
- IOS第十天——Obj-C的属性
- IOS第十天——Obj-C的属性
- IOS第十一天——Obj-C中的快速枚举
- IOS第十三天——使用Obj-C中的高级类
- IOS第七天——Obj-C中的继承
- IOS第四天——Obj-C的数据类型和表达式
- IOS第六天——Obj-C的内存管理初步认识
- IOS第六天——Obj-C的内存管理初步认识
- IOS第八天——Obj-C的多态性、动态类型和动态绑定
- IOS第八天——Obj-C的多态性、动态类型和动态绑定
- IOS第八天——Obj-C的多态性、动态类型和动态绑定
- obj-c属性的新的特性
- IOS第十二天——Obj-C++
- IOS学习笔记——Obj-c中实例方法与类方法的区别
- IOS第九天——Obj-C中的类别和协议
- IOS第九天——Obj-C中的类别和协议
- IOS第九天——Obj-C中的类别和协议
- Qt-文件夹的复制
- 软件设计需求分析---用例说明模板2(单列表格式)
- struts2工作流程
- JAVA解析JSON
- 树的问题?
- IOS第十天——Obj-C的属性
- Uva 10913 - Walking on a Grid
- 古堡算式
- TeeChart绘图控件 - 之三 - 提高绘图的效率
- duilib 源码分析
- Java正则表达式:我最期望弄懂的知识,希望对大家都有帮助
- Qt程序设计——文件/文件夹的创建
- 十个Python陷阱(1-3)
- Bloom Filter算法