Object-C基础—属性的介绍与使用
2014-09-18 22:16
260 查看
Object-c 2.0引入了属性的概念,使得我们可以通过点方法来访问对象的成员变量。假设有一个类为A, 该类有一个成员对象为mTest,mTest是一个类型为B的对象,现在已经有了一个A类的实例对象为a,为了能够用a.mTest 这样的方式,我们需要做到以下两点:
一、在头文件中用以下方式将mTest声明为属性
声明属性的语法:@property 类型 名字
比如我们可以这样写:@property(readwrite,nonatomic, retain) B *mTest;
这样的声明,最容易让人迷惑的是类型部分,其实属性主要分为三类:
1. 读写属性(readwrite/ readonly)
默认为readwrite,表示该属性既可以读取,也可以给该属性变量赋值;readonly则表示只能读取该属性变量。
2. 原子属性 (atomicity/nonatomic)
原子属性中,atomic是默认值,表示属性是原子的,支持多线程并发访问(在setter实现中加入了同步锁),后者是非原子的,适合在非多线程环境中提升效率,没有加入同步锁。
3. Setter属性 (assign/retain/copy)
如果属性是对象类型,你需要使用retain,assign,copy参数,表示setter方法内部实现的时候,持有对象的方式。其中retain就是增加引用计数,强引用类型。assign就是变量的直接赋值,弱引用类型,也是默认值。copy就是把setter的参数复制一遍,再赋给成员变量。 如果你不给出持有对象的方式,编译器就会给出警告。
属性的setter类型与内存管理密切相关,要相当谨慎使用,很多内存错误以及程序的莫名其妙崩溃都是由于对属性的不正确使用造成的。
二、在.m 文件中用以下方式合成对应的属性读取和设置函数
@synthesize mTest;
.m文件中有了上面这样一行,编译器就会自动合成getter函数,如果属性是可赋值的(即属性类型为readwrite),还会合成setter函数。编译器合成的getter函数名与属性名相同,合成的setter函数名则形如setMTest(即将属性的首字母大写)。
实际上,我们也可以不用编译器来帮我们合成方法,自己来实现属性的存取方法。为了这样做,我们需要将@synthesize mTest; 这句去掉,同时在.m文件中实现以下两个函数:
[cpp] view
plaincopyprint?
- (B *) mTest
{
// .......
}
- void setMTest:(B*) b
{
// .............
}
自己去实现存取方法是违背了属性的初衷的,一般不采用,给大家讲这个只是为了说明问题,仅此而已。
一、在头文件中用以下方式将mTest声明为属性
声明属性的语法:@property 类型 名字
比如我们可以这样写:@property(readwrite,nonatomic, retain) B *mTest;
这样的声明,最容易让人迷惑的是类型部分,其实属性主要分为三类:
1. 读写属性(readwrite/ readonly)
默认为readwrite,表示该属性既可以读取,也可以给该属性变量赋值;readonly则表示只能读取该属性变量。
2. 原子属性 (atomicity/nonatomic)
原子属性中,atomic是默认值,表示属性是原子的,支持多线程并发访问(在setter实现中加入了同步锁),后者是非原子的,适合在非多线程环境中提升效率,没有加入同步锁。
3. Setter属性 (assign/retain/copy)
如果属性是对象类型,你需要使用retain,assign,copy参数,表示setter方法内部实现的时候,持有对象的方式。其中retain就是增加引用计数,强引用类型。assign就是变量的直接赋值,弱引用类型,也是默认值。copy就是把setter的参数复制一遍,再赋给成员变量。 如果你不给出持有对象的方式,编译器就会给出警告。
属性的setter类型与内存管理密切相关,要相当谨慎使用,很多内存错误以及程序的莫名其妙崩溃都是由于对属性的不正确使用造成的。
二、在.m 文件中用以下方式合成对应的属性读取和设置函数
@synthesize mTest;
.m文件中有了上面这样一行,编译器就会自动合成getter函数,如果属性是可赋值的(即属性类型为readwrite),还会合成setter函数。编译器合成的getter函数名与属性名相同,合成的setter函数名则形如setMTest(即将属性的首字母大写)。
实际上,我们也可以不用编译器来帮我们合成方法,自己来实现属性的存取方法。为了这样做,我们需要将@synthesize mTest; 这句去掉,同时在.m文件中实现以下两个函数:
[cpp] view
plaincopyprint?
- (B *) mTest
{
// .......
}
- void setMTest:(B*) b
{
// .............
}
自己去实现存取方法是违背了属性的初衷的,一般不采用,给大家讲这个只是为了说明问题,仅此而已。
相关文章推荐
- Object-C基础—属性的介绍与使用
- Object-C 基础之1 — 属性的介绍与使用
- *Delphi控件之---UpDown以及其与TEdit的配合使用(比如限制TEdit只能输入数字,还有Object Inspector之组件属性的介绍)
- 使用jqMobi开发app基础:panel属性data-defer介绍
- Android 基础:常用布局 介绍 & 使用(附 属性查询)
- 使用ObjectUtil进行深度复制及获取对象的属性名称列表
- Silverlight Object 标签属性介绍、初始化参数的设置和获取、客户端系统信息获取
- 急!delphi中variant能否和object类型转换。实例:在使用getpropvalue(range,'属性')时提示类型有错,如何解决?!!
- SEO技巧:nofollow属性的介绍和使用
- CodeSmith使用基础教程 四 — 控制台与属性编辑器
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-类库介绍
- JQuery基础之(五)使用JQuery操作元素的属性和样式
- AJAX学习基础:简单介绍数据岛使用方法
- ASP.NET验证控件使用详解,介绍了基本属性和用法
- AutoGenerateColumns的使用属性介绍
- swfobject.js 详细使用介绍
- Silverlight Object 标签属性介绍、初始化参数的设置和获取、客户端系统信息获取
- Ext.form.ComboBox 属性详解及使用方法介绍和级联使用
- asp.net控件开发基础(10) -- 集合属性的使用
- 使用json-lib的JSONObject.toBean( )时碰到的日期属性转换的问题