一、属性
属性是Objective—C 2.0定义的语法,为实例变量提供了setter、getter方法的默认实现能在一定程度上简化程序代码,并且增强实例变量的访问安全性
OC中的属性机制提供了便捷的设置和获取实例变量的方式,或者说属性提供了一个默认的设置器和访问器的实现;属性提供的方法是现实可配置的,属性的好处:相当于自己编写这一对方法,属性提供了一系列清晰分明的说明参数来定义设置器和访问器的行为,编译器可以根据你设置的说明参数为你生成相应的方法,减少你的代码量和维护工作量
设置器(setter)与访问器(getter),提供了一个外界操作类内部属性的通道。因为类的属性,一般是私有的(private)假如没有这个方法那么这个属性的织就不能被外界所改变
(一)、属性的定义
属性的声明:使用@property声明属性
例如:@property NSString *name;
相当于@interface中声明了两个方法(setter和getter):
- (void)setName:(NSString *)name;
- (NSString *)getName;
(二)、属性的实现
属性的实现:使用@synthesize实现属性
例如:@ynthesize name = _name;
相当于@implementation实现了setter、getter
- (void)setName:(NSString *)name
{——}
- (NSString *)getName
{——}
例如定义一个完整的Person类,包含实例变量、属性、初始化方法、便利构造器方法以及功能方法:
h文件中如下:
m文件中如下:
main.m文件中如下:
二、属性的属性
Objective-C提供属性是得目的是为了简化程序员代码
为属性提供了一些关键字用以控制setter、getter的实现细节
这些关键字我们称为属性的属性(attribute)
一共3大类attribute
第一类:读写性控制 (readonly、readwrite、stter、getter)
readonly,告诉编译器,只声明getter方法(无setter方法)
例如:@property(readonly)NSString *name;
等价于- (NSString *)getName;
readwrite,告诉编译器,既声明setter又声明getter
例如:@property(readwrite)NSString *name;
等价于 - (void)setName:(NSString *)name;
- (NSString *)getName;
readwrite是读写性控制的默认设置
第二类:原子性控制 (nonatomic、atomic)
atomic。setter、getter方法在多线程访问下是绝对安全的,即setter、getter内部做了多线程访问处理。原子性控制的默认设置是atomic
nonatomic。setter、getter方法内部不会做多线程访问处理,仅仅是普通的setter、getter方法
程序开发过程中,setter、getter处处都在用,如果使用atomic,需要不断的对setter、getter枷锁解锁以保证线程访问安全,会很占用系统资源,降低系统性能
通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic。
例如:@property(readwrite,nonatomic)NSString *name;
等价于 - (void)setName:(NSString *)name;
- (NSString *)getName;
第三类:语义设置 (assign、retain、copy)
assign。setter、getter内部实现是直接赋值
例如:@property (nonatomic,assign)NSString *name;
- (void)setName:(NSString *)name {
_name = name;
}
- (NSString *)name {
return _name;
}
retain。setter、getter放入内部实现会做内存优化
copy。setter、getter的内部实现也会做内存优化
如果属性是非对象类型(比如int,float等)属性的语义设置使用assign
如果属性是对象类型(比如NSString、NSArray等)属性的语义设置使用retain
如果属性是对象并想得到参数的copy,使用copy关键字
三、点语法
点语法是Objective-C 2.0中定义的语法格式。提供了一种便捷的属性访问方式
点语法的使用
分时符合系统默认setter、getter书写格式的方法都可以使用点语法
例如:[person1 setName:@“zhangsan”];可以等价写成
person1.name = @“zhangsan”;。
NSString *name = [person1 name];可以等价写成
NSString *name = person1.name;
属性是一对getter、setter方法,点语法是属性的另一种调用格式
使用点语法进行赋值:
Person *person = [[Person alloc] init];
person.name = @"zhangsan";
person.age = 33;
person.gender = @"male";
NSLog(@"%@,%ld,%@",person.name,person.age,person.gender);
person.age = 33;
person.gender = @"male";
NSLog(@"%@,%ld,%@",person.name,person.age,person.gender);