一个类可能会有多个属性,而用来修饰属性的关键字有很多,我们也会经常遇到下面的面试题:atomic 和 nonatomic都可以用来修饰一个属性,为什么iOS开发中通常用nonatomic修饰属性?atomic是线程安全的吗?
@property(copy)NSString*address;
@property(atomic,copy)NSString*address;
@property(nonatomic,copy)NSString*address;
通常回答都会这样说:
atomic线程安全,性能低于nonatomic。noatomic不保证线程安全。
刨根问题的回答其实可以这样说:
1>第一种方式和第二种方式其实是一样的,因为不写atomic的话本身默认atomic修饰。
2>atomic说它是线程是安全的,是因为查看源码后可以发现,在对属性address,在编译器为我们生成setter和getter方法的时候,对getter和setter方法内部实现会做加锁的操作,加锁的目的就是为了保证存取值的安全性/完整性,也就是说getter和setter方法内部对于值的存取是线程安全的,并不能保证操作这个属性的时候是线程安全的。正因为如此,atomic线程是依次执行,性能大有折扣。相比nonatomic,会有多个线程对getter和setter方法操作,无法保证顺序性,也无法保证存取值的安全性和完整性,性能自然就比较高速。
网友评论