Object-C基础—属性的介绍与使用
2012-04-10 10:55
435 查看
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文件中实现以下两个函数:
自己去实现存取方法是违背了属性的初衷的,一般不采用,给大家讲这个只是为了说明问题,仅此而已。
一、在头文件中用以下方式将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文件中实现以下两个函数:
- (B *) mTest { // ....... } - void setMTest:(B*) b { // ............. }
自己去实现存取方法是违背了属性的初衷的,一般不采用,给大家讲这个只是为了说明问题,仅此而已。
相关文章推荐
- Object-C基础—属性的介绍与使用
- Object-C 基础之1 — 属性的介绍与使用
- 使用jqMobi开发app基础:panel属性data-defer介绍
- Android 基础:常用布局 介绍 & 使用(附 属性查询)
- *Delphi控件之---UpDown以及其与TEdit的配合使用(比如限制TEdit只能输入数字,还有Object Inspector之组件属性的介绍)
- Html中value和name属性的作用及其使用介绍!
- meta标签属性使用介绍
- Core Animation基础介绍、简单使用CALayer以及多种动画效果
- 使用json-lib的JSONObject.toBean( )时碰到的日期属性转换的问题
- meta标签中的http-equiv属性使用介绍
- CSS中不为人知Zoom属性的使用介绍(IE浏览器不得不说的坑)
- PHP循环函数使用介绍之PHP基础入门教程
- iOS在分类中声明属性的方法(不提倡使用)以及关联对象介绍
- Android三种动画(属性、视图、帧动画)介绍基本使用
- TestDriven.Net常用属性介绍及使用
- 急!delphi中variant能否和object类型转换。实例:在使用getpropvalue(range,'属性')时提示类型有错,如何解决?!!
- iOS边练边学--UIScrollView的属性简单使用,代理的简单介绍以及内容缩放
- UI基础-基础控件-0323-xcode使用与UIView的几个基本属性
- PHP循环函数使用介绍之PHP基础入门教程
- iOS开发UI基础—26简单介绍静态单元格的使用