属性的特性

任何属性都有一组特性,用于描述相应存取方法的行为,如下

1
2
//OC
@property (nonatomic, readwrite, strong) NSString *name;

多线程特性

多线程特性有两种可选类型:nonatomicatomic,分别代表单线程和多线程。

nonatomic不是默认类型所以在声明属性时必须明确的写出nonatomic

读/写特性

读/写特性也有两种可选类型:readwritereadonly,分别代表读写和只读。其中readwrite 是默认类型。

内存管理特性

内存管理特性有四种可选类型:strongweakcopyunsafe_unretained,这些类型决定相应的实例变量将如何引用对象。

strong为默认类型。ARC自动+1。

weak是为了避免引用循环。对象销毁指针也自动销毁。

copy类似于下面这个代码,它会将传入的值先复制一遍,_name指向新的复制的对象。

1
2
3
4
5
//OC
-(void)setName:(NSString *)name
{
_name = [name copy];
}

这样做是因为,如果熟悉指向的对象类有可修改的子类,那么属性可能会指向可修改的子类对象,同时该对象可能会被其他拥有者修改,因此先复制该对象,再将属性指向复制后的对象。

unsafe_unretained这种类型指针指向的对象被销毁时,指针不会自动设置为nil,而是成为空指针,所以不安全。