Objective-C中的@property和@synthesize用法

Objective-C中的@property和@synthesize用法

1.关键词@property和@synthesize在Obj-c中是配对使用的,用于对声明和实现的编码简化;
eg:
头文件(.h)中声明

@property int personAge;

等价于:

-(int)personAge;
-(void)setPersonAge:(int)age;

文件(.m)实现

@synthesize personAge;

等价于:

-(int)personAge
{
    return personAge;    
} 
-(void)setPersonAge:(int)age
{
    personAge = age;
}

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

@property (readwrite,copy)NSString *personName;

其中参数主要分为3类:
<1>.访问器控制:(readwrite/readonly)
<2>.内存管理:(assign/retain/copy/strong/weak/unsafe_unretained)
<3>.原子性:(atomicity/nonatomic) 
readwrite
声明此属性为读写属性,即可以访问设置方法(setter),也可以访问获取方法(getter),与readonly互斥。
readonly
声明此属性为只读属性,只能访问此属性对应的获取方法(getter),与readwrite互斥。
assign
默认类型,用于值类型(int、float、double和NSInteger,CGFloat等表示单纯的复制),还包括不存在所有权关系的对象(常见的如delegate),声明在setter方法中,采用直接赋值来实现设值操作。eg:

-(void)setPersonName:(NSString *)name
{
    personName = name;
}

retain
意味着实例变量要获取传入参数的所有权,声明在setter方法中,需要对设过来的值进行retain 加1操作。eg:

-(void)setPersonName:(NSString *)name
{    
    if (personName != name)
   {
        [personName release];
        personName = [name retain];
    }
    personName = name;
}

copy
调用此实例的copy方法,设置克隆后的对象。实现参考retain。 
strong
是在ARC伴随IOS引入的时候引入的关键字是retain的一个可选的替代。表示实例变量对传入的参数要有所有权关系即强引用。strong跟retain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系。
weak
与assign的效果相似,不同的是weak在对象被回收之后自动设置为nil。而且weak智能用在iOS 5或以后的版本,对于之前的版本,使用unsafe_unretained。
unsafe_unretained
weak的低版本替代。
nonatomic
在默认的情况下,通过synthesized 实现的 setter与getter都是原子性访问的。
多线程同时访问时,保障访问方法同时只被访问一个线程访问,eg:

[ _internal lock ]; // lock using an object-level lock  
id result = [ [ value retain ] autorelease ];  
[ _internal unlock ];  
return result;  

但如果设置nonatomic时,属性的访问为非原子性访问,但访问速度比atomic快,在单线程和明确只有一个线程访问的情况下广泛使用。

3.@synthesize
对于下面的@propety 

@property (nonatomic, copy) NSString *personName; 

默认合成的规则为:

@synthesize personName = _personName;

其中_personName是编译器自动帮我们创建的;
@synthesize 中也可以定义 与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问。

posted @ 2015-04-23 19:21  sz_leez  阅读(459)  评论(0编辑  收藏  举报