您的位置:首页 > 运维架构

关于@property&@synthesize使用详解

2015-08-05 23:28 357 查看
@property & @synthesize是iOS中支持的快捷 设置/访问 对象成员的途径,自动为对象生成setter & getter方法。在iOS 5.0之后,@synthesize可以省略。

一、@property & @synthesize简介

@property & @synthesize最直接体现Object-C语言的封装特性,无法直接访问和设置对象成员变量,必须通过setter和getter方法进行成员变量的访问和设置。这样的话,通常要为每一个支持外边访问的成员变量写两个方法,这种操作比较繁琐且无意义。@property & @synthesize简化了这种处理方式:

下面以 Person 类为例:

在. h 文件中进行声明:

@interface Person : NSObject

{

NSString * _name;

}

@property NSString * name;

表示声明了属性: name 默认生成对应的 setter 和 getter 方法

在. m 文件中进行生成:

@implementation Person

@synthesize name = _name;

@end

在iOS 5.0之后,.m文件中不必在说明@synthesize name = _name;会自动生成对应的getter和setter。其中name = _name表示在生成的getter&setter中操作的实例变量是_name,如果省略了_name,那么会在.h中生成同名的实例变量name,并且此时setter和getter中操作的实例变量是name。

二、@property使用

2.1 声明语法

声明property的语法为:

@property (参数列表) 类型 名字;

其中参数列表之间使用英文逗号’ , ‘间隔。

参数主要分为三种类型,分别指定属性的几种特性:读写属性、setter语意、原子性、引用类型。

2.2 参数的详细解释

2.2.1 原子性(atomic、nonatomic)

atomic:默认是有该属性的,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。(附:@synchronsizer参见)

nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。

2.2.2 读写属性(readwrite、readonly)

readwrite:这个属性是默认的情况,会自动为你生成存取器。

readonly:只生成getter不会有setter方法。

readwrite、readonly这两个属性的真正价值,不是提供成员变量访问接口,而是控制成员变量的访问权限。

2.2.3 setter语义(assign、copy、retain)

assign:默认类型,setter方法直接赋值不改变引用计数。一般用来处理基本数据类型。

retain: 旧对象进行release操作,引用计数-1;新对象进行retain操作,引用计数+1。本质上是指针的拷贝,首先获取旧对象的指针,之后对旧对象进行release操作,然后把指针指向新的对象,并且是新的对象引用计数+1。

copy:与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1.为了减少对上下文的依赖而引入的机 制。我理解为内容的拷贝,向内存申请一块空间,把原来的对象内容赋给它,令其引用计数为1。对copy属性要特别注意:被定义有copy属性的对象必须要 符合NSCopying协议,必须实现- (id)copyWithZone:(NSZone *)zone方法。

2.2.3 引用类型(strong、weak)

strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。

weak:弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。

strong与retain功能相似;weak与assign相似,只是当对象消失后weak会自动把指针变为nil;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  property