在用@property声明属性时,在property和变量类型中间,加上括号(),括号里就要写attribute。
attribute一共可以分为三大类:
读写性控制:readonly、readwrite、setter、getter
1、用readonly修饰的,只能读不能写,也就是只能生成getter方法,不能生成setter方法。
2、用readwrite(默认),可以进行读写,也就是说,要生成getter和setter方法。
3、用setter来修饰的,用来修改默认生成的setter方法名,修改成自己想要的方法名,方法名不能漏了冒号:。
4、用getter来修饰的,用来修改默认生成的getter方法名,修改成自己想要的方法名。
Teacher.h
#import <Foundation/Foundation.h> @interface Teacher : NSObject //加上attribute
//readonly 只读。不生成setter方法,只生成getter方法。 //readwrite 可读可写,默认,生成getter,setter方法。 @property(readonly) NSString *name; //getter 更改默认 getter 的方法名 //setter 更改默认 setter 的方法名,注意setter方法名要加冒号: @property(getter=a,setter=b: )NSString *sex; @end |
Teacher.m
#import "Teacher.h" @implementation Teacher
@end |
原子性控制:nonatomic、atomic
原子性控制,在多线程的情况下,才能体现其作用。
nonatomic:是不加多线程保护,这种情况下,可以随意打断,然后另外一个人来做另外一件事。此时getter、setter内部不会做多线程访问处理,就是普通的getter、setter方法。
atomic:(默认的)加多线程保护,此时就是,只能在做完一件事后,才能坐另外一件事,中间不能打断。getter、setter方法在内部做了多线程处理,是安全的。
由于我们写的很多程序都是单线程的,很少写多线程的程序,我们就应该把atomic设置成nonatomic,因为atomic会消耗资源。
Teacher.h
#import <Foundation/Foundation.h> @interface Teacher : NSObject //加上attribute //nonatomic ,没有多线程保护,随时可能被打断 //atomic ,多线程保护,一件事干完为止,中间不能被打断。(默认)(耗费资源) @property (atomic)NSString *money;
@end |
语义设置:assign、retain、copy
1、用assign标记的变量,不能同时声明getter、setter方法,只能写其中一个。只有加上@synthesize 属性变量名 = _ 属性变量名,这个声明时,才能同时写getter、setter方法。
assign标记的有:标量(基本类型)、delegate(代理)。
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject //assign 1.用在标量(基本类型)2.用在delegate(代理) @property (nonatomic,assign)NSInteger age; @end |
Person.m (assign的内部实现)
#import "Person.h"
@implementation Person //加上@synthesize age = _age,才能同时写getter,setter方法 @synthesize age = _age; //声明里用assign标记,不能同时写getter,setter方法。 //assign - (void)setAge:(NSInteger)age{ _age = age; } - (NSInteger)age{ return _age; } @end |
2、retain
retain标志的,除了标量,都可以去标识。
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject //retain 1.一般对象都用retain。(除了标量不能用retain,其他都能用) @property (nonatomic,retain)NSString *name; @end |
Person.m( retain的内部实现)
#import "Person.h" @implementation Person @synthesize name = _name; //retain内部实现 - (void)setName:(NSString *)name{
if (_name != name) { [_name release]; _name = [name retain]; } }
- (NSString *)name{ return [[_name retain] autorelease]; } @end |
3、用copy的标识的,必须要遵守<NSCopying>协议。
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject //1.遵循了NSCopying协议的; @property (nonatomic,copy)NSString *sex; @end |
Person.m(copy的内部实现)
#import "Person.h" @implementation Person @synthesize sex = _sex; //copy内部实现
- (void)setSex:(NSString *)sex{ if (_sex != sex) { [_sex release]; _sex = [sex copy]; } }
- (NSString *)sex{ return [[_sex retain]autorelease]; } @end |