当前位置: 首页 > 面试题库 >

iOS atomatic nonatomic区别和理解

屠嘉勋
2023-03-14
本文向大家介绍iOS atomatic nonatomic区别和理解相关面试题,主要包含被问及iOS atomatic nonatomic区别和理解时的应答技巧和注意事项,需要的朋友参考一下

在平时创建对象@property的时候,我们会有用到atomicnonatomic,但两者的区别在哪里

atomic

  • 是默认的
  • 对同一对象的set和get的操作是顺序执行的
  • 速度不快,因为要保证操作整体完成
  • 线程安全,需要消耗大量系统资源来为属性加锁
    使用atomic并不能保证绝对的线程安全,对于要绝对保证线程安全的操作,还需要使用更高级的方式来处理,比如NSSpinLock、@syncronized等

nonatomic

  • 不是默认的
  • 更快
  • 如有两个线程访问同一个属性,会出现无法预料的结果
  • 非线程安全,适合内存较小的移动设备

在不添加atomicnonatomic的情况下,默认的是atomic

atomic修饰的属性,系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。比如,线程 A 的 getter 方法运行到一半,线程 B 调用了 setter:那么线程 A 的 getter 还是能得到一个完好无损的对象。

nonatomic修饰的属性,不做保持getter完整性保证,但在运行速度上要比atomic快

快速理解
假设有一个 atomic 的属性 "name",如果线程 A 调[self setName:@"A"],线程 B 调[self setName:@"B"],线程 C 调[self name],那么所有这些不同线程上的操作都将依次顺序执行——也就是说,如果一个线程正在执行 getter/setter,其他线程就得等待。因此,属性 name 是读/写安全的。

但是,如果有另一个线程 D 同时在调[name release],那可能就会crash,因为 release 不受 getter/setter 操作的限制。也就是说,这个属性只能说是读/写安全的,但并不是线程安全的,因为别的线程还能进行读写之外的其他操作。线程安全需要开发者自己来保证。

如果 name 属性是 nonatomic 的,那么上面例子里的所有线程 A、B、C、D 都可以同时执行,可能导致无法预料的结果。如果是 atomic 的,那么 A、B、C 会串行,而 D 还是并行的。

简单来说,就是 atomic 会加一个锁来基本保障线程安全(但不能保证线程安全),并且引用计数会 +1,来向调用者保证这个对象会一直存在。假如不这样做,如有另一个线程调 setter,可能会出现线程竞态,导致引用计数降到0,原来那个对象就释放掉了。




 类似资料:
  • 本文向大家介绍http和https的区别与理解?相关面试题,主要包含被问及http和https的区别与理解?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: https的SSL加密是在传输层实现的。 (1)http和https的基本概念 http: 超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器

  • 流处理和传统消息处理的基本区别是什么?正如人们所说,kafka是流处理的好选择,但本质上,kafka是一个类似于ActivMQ、RabbitMQ等的消息传递框架。 为什么我们通常不说ActiveMQ也适合流处理呢。 消费者消费消息的速度是否决定了它是否是流?

  • 本文向大家介绍说说你对SVN和GIT的理解和区别相关面试题,主要包含被问及说说你对SVN和GIT的理解和区别时的应答技巧和注意事项,需要的朋友参考一下 职业早期使用过 SVN,记得在windows上面一个小乌龟的图标,不太聪明的亚子。。 svn是集中式的,允许单次下载单文件修改,因为对每个文件都有对应的.svn文件控制 git是分布式的,每次clone都是获得一个完整的代码版本,可以不依赖服务器本

  • 本文向大家介绍& 和 && 的区别?相关面试题,主要包含被问及& 和 && 的区别?时的应答技巧和注意事项,需要的朋友参考一下 &运算符是:逻辑与;&&运算符是:短路与。 &和&&在程序中最终的运算结果是完全一致的,只不过&&存在短路现象,当&&运算符左边的表达式结果为false的时候,右边的表达式不执行,此时就发生了短路现象。如果是&运算符,那么不管左边的表达式是true还是false,右边表达

  • 问题内容: 我所看到的一些问题和相关的错误和。访客中的任何人都可以解释域名的差异吗? 问题答案: 编码是指所使用的字符集。 排序规则确定排序顺序。 参见:http : //dev.mysql.com/doc/refman/5.5/en/charset- general.html

  • 本文向大家介绍AdaBoost和GBDT的区别,AdaBoost和GBDT的区别?相关面试题,主要包含被问及AdaBoost和GBDT的区别,AdaBoost和GBDT的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: AdaBoost通过调整错分的数据点的权重来改进模型,而GBDT是从负梯度的方向去拟合改进模型。 AdaBoost改变了训练数据的权值,即样本的概率分布,减少上一轮被正