Object-C基础—属性的介绍与使用
来源:互联网 发布:data science 知乎 编辑:程序博客网 时间:2024/06/02 03:40
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文件中实现以下两个函数:
- - (B *) mTest
- {
- // .......
- }
- - void setMTest:(B*) b
- {
- // .............
- }
自己去实现存取方法是违背了属性的初衷的,一般不采用,给大家讲这个只是为了说明问题,仅此而已。
- Object-C基础—属性的介绍与使用
- Object-C基础—属性的介绍与使用
- Object-C基础—属性的介绍与使用
- Object-C 基础之1 — 属性的介绍与使用
- (object-c)属性的使用
- object-c定义属性与成员变量的区别
- object-c定义属性与成员变量的区别
- Object—C基础
- iOS学习笔记:Object-C基础语法(OC介绍与Foundation初步)
- Object-C基础(7)——类与对象
- Object-C基础(13)——字典与谓词
- Object-C 基础之10 — 使用xml进行归档
- Object-C 基础之10 — 使用xml进行归档
- Object-C中类的属性
- Object-C基本的数据类型介绍
- Object-c集合的简单介绍
- Object-c------NSArray的简单介绍
- Object-c------NSSet的简单介绍
- 文件读写
- Android中JNI的使用方法
- 浅谈爱情
- Boost.bind 的使用
- 线性回归介绍之三——线性回归的使用条件
- Object-C基础—属性的介绍与使用
- 高IQ孩子的特征[图]
- Silverlight读取web.config配置文件
- 线性回归介绍之四——如何做散点图
- php通过socket向应用程序发数据
- 【javascript】javascript中的闭包
- CAT表中EMM PID 和 PMT表中ECM 的解析
- poj 1463
- NSObject:类与协议