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的命名,籍此来保护变量不会被不恰当的访问。