2.属性详解(@property/@dynamic/@synthesize)

上一篇文章讲到, OC 2.0之后属性一旦声明,如果没有readonly修饰的话,当前类自动生成了setter和getter方法的声明, 并且会自动生成对应的实例变量(下划线 + 属性名)。而setter和getter就是访问这个实例变量的方法。

@property分为@property 和@dynamic或者@synthesize:
- @property, 写在.h文件的@interface中,完成属性的声明
- @dynamic或者@synthesize, 写在.m文件的@implementation中,完成属性是实现
- @dynamic 意思是由开发人员提供相应的代码:对于只读属性需要提供 getter,对于读写属性需要提供 getter 和setter。@dynamic的意思是告诉编译器,属性的获取与赋值方法由用户自己实现,不自动生成。
- @synthesize 意思是,除非开发人员已经做了,否则由编译器生成相应的代码,以满足属性声明。

//.h 文件中
@property (nonatomic)NSInteger age;
@property (nonatomic,copy)NSString *name;
@property (nonatomic,retain)NSNumber *number;

//.m 文件中
@synthesize name = _name ,age = _age ,number = _number;
//该语句不写就是默认自动生成的,代表所有 setter 和 getter 方法的实现

在平时的使用中, 在.h 中进行 @property 后, 会自动在.m 中生成相对应的@synthesize。但有一种情况下, 声明属性是不会自动生成setter和getter方法的声明和对应的实例变量的。那就是手动在.m 中添加@synthesize 的时候。

@synthesize的作用:
1.实现了属性的name,age,number
2.规定了该属性声明的 setter getter 方法所操作的实例变量
3.如果@ synthesize 省略不写,则自动生成对应属性的 setter 和 getter 方法,默认操作的实例变量是属性名+’_’
4.检测对应的实例变量,如果没有找到认为生成的实例变量,则会自动生成对应的实例变量(‘_’ + 属性名)
5.如果我们重写 setter 和 getter 方法的实现,那么@ synthesize 就不会在时下对应的 stter 和 getter 方法也就不会检测实例变量是否存在,也就不会帮助我们生成对应的实例变量,则需要我们自己添加实例变量

关于@property 的说明:
1.读写特性
(1)readwrite (可读可写)默认属性,既生成setter方法,又生成gette方法
(2)readonly (只读),只生成getter方法,不会生成setter方法
(3)setter = 方法名,给生成的setter方法起一个其他的方法名
(4)getter = 方法名,给生成的getter方法起一个其他的方法名

2.原子特性
(1)atomic (原子特性)默认属性,保证线程安全,也就是当前的实例变量只能由一个线程访问,在这个过程中有一个加锁解锁的过程

3.语义特性
(1)assign 默认属性,一般用来修饰非对象类型的属性
(2)retain 针对于对象,会将对象的引用计数+1
(3)copy 针对于对象,将对象拷贝一份,产生一个新的对象
//注: 一般的 NSString/block需要为其属性添加copy的属性,其他对象添加retain属性

你可能感兴趣的:(dynamic,属性,property,synthesize,语义特性)