OC中的@property和@synthesize
学习链接:https://www.jianshu.com/p/2654198f4d08
OC中提供两个关键字@property和@synthesize,用于提供setter和getter方法,使得代码更加简洁,在这不多做介绍,看完会用就行。
一般@property在.h文件中使用,@synthesize在.m文件中使用
-
以实例属性 _name 为例:
属性声明:@property NSString *name;
相当于在 @interface 中声明两个方法:
setter方法:- (void)setName:(NSString *)name;
getter方法:- (NSString *)name; -
属性的实现:在 .m 文件中使用 @synthesize 实现属性
以实例变量 _name 为例:
属性实现:@sybthesize name = _name;
相当于在 @implementation 中实现两个方法
-(void)setName:(NSString *)name { _name = name; }
-(NSString *)name { return _name; }
值得注意的是_属性名这个变量是私有的,如果重写了setter和getter变不再会自动生成了
下面还有一些控制属性的特性:
-
读写性
读写性的控制(readonly、readwrite、setter=、getter=)
readonly:只读状态,是告诉编译器,属性值生成 getter 方法,不生成 setter 方法。
readwrite:读写状态,是告诉编译器,属性值生成 getter 方法,又生成 setter 方法,既有设置器,也有访问器,默认的读写特性。
setter=:指定属性生成的setter方法的名字。
getter=:指定属性生成的getter方法的名字。 -
原子性
原子性控制(atomic、nonatomic)
控制属性在多线程进行访问的安全问题。
atomic:原子特性,是线程安全的访问,setter、getter 方法在多线程访问下是绝对安全的。每次只允许一个线程访问属性,默认是atomic,属性比较常用,atomic会不停对属性做加锁解锁操作,消耗资源,降低系统性能。
nonatomic:非原子性控制,setter、getter方法内部不做线程安全控制,仅仅是普通的setter、getter方法,一般情况下使用nonatomic。 - 语意特性
assign:一些基本数据类型(非对象类型,比如int、float等)的属性使用assign,使用assign,setter,getter方法直接赋值。
@property (nonatomic, assign) NSInteger age;
retain:一般对象作为属性(比如NSString等)的时候,并且要保留这个对象的时候,已修改全修改,跟strong差不多。@property (nonatomic, retain) NSString *name;
-(void)setName:(NSString *)name { if (_name != name) { [_name release]; _name = [name retain]; } } - (NSString *)name { return [[_name retain] autorelease]; }
copy:一般对象需要拷贝一个对象副本的时候使用,拷贝了一份新的,原来的修改,新的不会修改。@property (nonatomic, copy) NSString *gender;
-(void)setGender:(NSString *)gender { if (_gender != gender) { [_gender release]; _gender = [gender copy]; } } -(NSString *)gender { return [[_gender retain] autorelease]; }