一、属性
什么是属性?
属性是Objective-C 2.0定义的语法,提供setter、getter方法的默认实现。在一定程度上简化程序代码,并且提高程序的安全性。
属性的定义:
属性的声明:在.h文件中使用@property
声明属性。
以实例变量_name为例:
@property (nonatomic, copy) NSString *name;
相当于在@interface
中声明了两个方法:
//setter方法
- (void)setName:(NSString *)name;
//getter方法
- (NSString *)name;
属性的实现:在.m文件使用@synthesize
实现属性
@synthesize name = _name;
相当于在@implementation
中实现了:
//setter方法
- (void)setName:(NSString *)name
{
_name = name;
}
//getter方法
- (NSString *)name
{
return _name;
}
注:
1. @synthesize
可以省略,只使用@property
声明属性即可。
2. 通过等号右边的实例变量表示setter、 getter方法的实现内部到底与那个实例变量建立联系。
3. 如果没有写@synthesize name = _name
;这行代码,也没有声明一个实例变量叫_name。此时系统会自动生成一个实例变量叫_name。如果我们已经声明了一个实例变量叫_name,那么就用我们声明的。
4. 如果写@synthesize name
;系统会自动生成一个实例变量叫name并使用这个实例变量,此时name实例变量与外界我们自己生成的实例变量_name没有任何关系。
二、属性的特性
1. 读写性控制:
(1). readonly只读属性,默认只生成getter方法,不生成setter方法。
(2). readwrite读写属性,既生成setter方法,也生成getter方法。属性的默认读写性控制就是readwrite。没有只写属性!
(3). setter= 给属性对应的setter方法改名字。
(4). getter= 给属性对应的getter方法改名字(当属性的类型是BOOL类型,可以考虑修改该属性的getter方法名为is + 属性名)。
2. 原子性:
(1). atomic原子性,在多线程访问下是线程安全的(加锁),但是对资源的消耗比较大。
(2). nonatomic非原子性,在多线程访问下是线程不安全的,对资源的消耗比较小,是我们以后经常使用的。
3. 语义特性:(assign,retain,copy)
(1). 属性是非对象类型(如:int, float等)属性的语义设置使用assgin。
(2). 属性是对象类型(如:NSString等)属性的语义设置使用retain。
(3). 属性是对象类型并且想得到对象的副本,使用copy
示例:
@property (nonatomic, setter=AAA:, getter=aaa, copy) NSString *gender;
三、点语法
只要符合系统默认setter、getter书写格式的方法都可以使用点语法。
示例:
//setter方法
[person setName:@"张三"];
//使用点语法
person.name = @"张三";
//getter方法
NSString *string = [person name];
//使用点语法
NSString *string = person.name;
属性是一对getter、setter方法,点语法是属性的另一种调用格式。