atomic和nonatomic

2021-12-23  本文已影响0人  大长腿裤子太短

一个类可能会有多个属性,而用来修饰属性的关键字有很多,我们也会经常遇到下面的面试题: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方法操作,无法保证顺序性,也无法保证存取值的安全性和完整性,性能自然就比较高速。

set get
上一篇下一篇

猜你喜欢

热点阅读