属性:属性是一对setter、getter方法。
属性的声明:在.h文件中声明,使用@property关键字声明属性
属性类型是setter方法中参数类型,也就是getter方法中返回值类型
属性名:name,不加下划线,只有实例变量才加下划线 @property (nonatomic, copy)NSString *name 以上这句等价于声明一对声明setter、getter方法
- (void)setName:(NSString *)name;
- (NSString *)name;
属性的实现:在.m文件中,使用@synthesize关键字实现属性
等号左边是属性名,等号右边是实例变量。
属性name对应实现的是setter方法,是为关联的实例变量进行赋值,而对应的getter方法,是获取关联实例变量的值。 @synthesize name = _name;
以上一句等价于一对实现setter、getter方法
- (void)setName:(NSString *)name{
_name = name;
}
- (NSString *)name{
return _name;
}
@synthesize在类的实现部分
在Xcode4.5以及之后的版本中,@sythesize可以省略,在.h文件中只使用@property声明属性即可。编译器默认声明对应的实例变量。(即不用在声明中出下划线对应的_name这种,而是由系统自动生成,但是生成的实例变量的可见度是私有的,子类不能访问) 如果在.h文件中只声明了@property,而在.m文件中重写了setter、getter方法,必须用@sythesize实现属性,才能生成实例变量。
属性的特性设置(属性的属性)
1、读写特性
①readwrite,默认的,可读可写,编译器声明了setter、getter方法。
②readonly,只读,编译器只声明了getter方法。
③setter=,设置编译器声明的setter方法的名字。
④getter=,设置编译器声明的getter方法的名字,一般用在BOOL类型的属性
@property(nonatomic, getter = isDeath)BOOL death; @property (readwrite, setter=aa:, getter=bb) NSInteger age;//修改age的setter、getter方法名
2、原子性
①atomic 原子性,默认修饰符,提供线程安全保护,通过不断的加锁解锁实现在同一时刻实例变量只能被一个线程访问,但是不断的加锁解锁会耗费大量的CUP性能。
②nonatomic 非原子性,setter、getter方法内部不会做多线程的处理,不保证安全,但大多数情况下使用。
3、语义性(属性中最重要的属性)
①assign 修饰的是非对象类型基本数据类型(int float等)、delegate使用 @property (nonatomic)CGFloat height;//默认readwrite、assign ②retain 对象类型
③copy 也是用来修饰对象类型的属性,但是一定要保证,代表属性类型的这个类,必须接收了NSCopying协议,而且实现了copyWithZone:方法。字符通常用copy修饰。 @property (nonatomic, copy)NSString *major;
每个语义都有各自对应的getter、setter方法可以不使用编译器的方法自己自定义方法。
在类的内部,自己实现setter、getter方法:
①语义设置为assign时,setter、getter的内部实现,直接赋值。
②语义设置retain时,间接赋值
③语义设置copy时,间接赋值
点语法:
点语法是一种快捷访问属性的方法 在不同的语境下,点语法会代指setter、getter方法 如果点语法出现在等号的左边,并且存在赋值意义,那么就是setter方法
如果点语法出现在等号右边,那么就是初值的getter方法