通常我们在开发iOS都会使用@property来定义属性,那么我们今天就来仔细探究一下@property。
@property的作用
@property声明的属性会自动生成一个带下划线的成员变量,并自动生成对应属性的setter/getter方法,但你在代码不会看到它们,但能够使用。
比如使用self.属性的时候就会使用就会使用到setter/getter方法,setter/getter方法中默认使用带下划线的成员变量。
结论:@property = _成员变量 + setter/getter方法
@property的属性关键字
关键字分为四类:原子性、内存管理、读写权限和大家容易漏掉的为空性。
原子性:
- atomic(默认):这个属性是为了保证程序在多线程情况下的线程安全,编译器会自动生成互斥加锁代码,避免该变量的读写不同步问题。
- nonatomic:如果该对象无需考虑多线程的线程安全,通常使用这个关键字,这样会让编译器少生成互斥加锁代码,可以提高性能。
如果同时有两个或者两个以上的线程同时对一个属性就行赋值,这个时候为了保证属性调用前后的一致性,我们就要做些保护操作,这就是传说中的线程安全。
线程安全就是为了保证在多线程环境中,有且仅有一个线程能对当前属性进行set和get操作,其他线程必须等待其完成操作之后再进行操作。
我们通常会尽量人为避免多线程安全问题,所以一般使用nonatomic来提高