天天看点

OC学习: @property和@synthesize用法概述

一、Xcode 4.4之前(不包括4.4)

@property与@synthesize是成对出现的。

@property关键字用来自动生成某个成员变量的setter和getter声明。

@property int age; 
           

可用来替换以下代码:

- (int)age; - (void)setAge: (int)newAge;

@synthesize关键字是用来自动生成某个成员变量的setter和getter实现。

例如

@synthesize age = _age;
           

可用来替换@implementation中的下列代码:

- (void)setAge: (int)age
{
  _age = age;
}

- (int)age
{
  return _age;
}
           

二、对@property语法的说明

声明property的语法为:@property (参数1,参数2) 类型 名字;

如:

@property(nonatomic,retain) UIWindow *window;  
           

其中参数主要分为四类:

1、atomic与nonatomic

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

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

2、readwrite与readonly

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

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

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

3、strong、weak、assign、copy、retain

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

retain:释放旧的对象(release),将旧对象的值赋给新对象,再令新对象引用计数为1。我理解为指针的拷贝,拷贝一份原来的指针,释放原来指针指向的对象的内容,再令指针指向新的对象内容。

copy:与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1。

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

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

strong与retain功能相似;weak与assign相似,只是当对象消失后weak会自动把指针变为nil;

strong 与weak是xcode 4.4之后新增的关键字。

4、getter setter

getter:是用来指定get方法的方法名

setter:是用来指定set访求的方法名

在@property的属性中,如果这个属性是一个BOOL值,通常我们可以用getter来定义一个自己喜欢的名字,例如:

@property (nonatomic, assign, getter=isValue) boolean value;
@property (nonatomic, assign, setter=setIsValue) boolean value;
           

三、Xcode4.4 之后

@property int age;
           

即可自动生成 int _age成员变量, _age的setter和getter的声明与实现。更简便更快捷了。不用再写@synthesize了。

注意:

此时内存管理参数还是要考虑加进去的,有关参数看上一章。