1

我已经阅读了很多关于 Objective-C 中的atomicnonatomic属性的主题,我知道这atomic意味着线程安全,因此nonatomic速度更快。但主要问题是我根本不明白什么是线程以及它们在代码中是如何表达的。它们是一种方法吗?而且我还注意到大多数属性都是nonatomic,这是为什么呢?我看到线程可以同时访问属性的 setter 或 getter,这怎么可能,以及如何在运行时表达?作为一个新手程序员,我应该更喜欢atomic还是nonatomic

我已经搜索了很多关于此的问题,但没有一个真正回答我的问题。

4

2 回答 2

0

正如 Martin 指出的那样,人们通常不依赖atomic限定符,因为它(通常)不能确保线程安全。关键的观察是,必须正确同步变量的更改,如Martin 指出的线程编程指南的同步部分中所讨论的那样。

因此,在回答您的问题时,您通常应该使用nonatomic(它比 快一点atomic),然后确定各种同步技术中的哪一种(串行队列、NSLockNSRecursiveLock@synchronized等)作为更广泛的线程安全系统设计的一部分. 在某些情况下,atomic可能是该解决方案的一部分(正如线程编程指南的同步 - 原子操作部分指出原子操作是“一种适用于简单数据类型的简单同步形式”),但正如您经常处理对象,而不是简单的数据类型,那么很可能是不够的。atomic

顺便说一句,如果您是第一次深入研究多线程代码,我可能还建议您查看并发编程指南,其中讨论了一种更简单的方法来编写多线程代码,而无需深入了解NSThread. 您可以使用调度队列(Grand Central Dispatch)和操作队列(NSOperationQueue)。

一些额外的参考:

还有很多关于该主题的其他 WWDC 视频,但这可能是两个很好的开始。

于 2013-11-09T20:05:39.297 回答
0

什么是线程以及它们在代码中的表达方式

说真的,这是一个很大的话题。所以这里有一些想法和最后一个问题的具体答案。

实际上,并不是所有的程序都需要并发,所以我想说,如果你在你的应用程序中没有找到它的需求,你可以放松一下。那么你的属性是否存在atomic并不重要。

作为一个新手程序员,我应该更喜欢atomic还是nonatomic

作为新手程序员,我会说将它们保留为默认值。如果它们被完全合成,编译器会诚实地为你合成一个原子 getter 和 setter。这并没有错,当然,在您分析应用程序并发现这是一个问题之前,您不应该“尝试让它们更快”。

如果您自己为您的属性提供方法,那么您的属性实际上将是nonatomic,但我不确定这样标记它们是否值得付出努力。尝试在可能被其他人重用的代码中做到这一点。

在某些情况下,编译器会强制您声明属性是nonatomic(当您将自定义 setter 与合成 getter 配对时,反之亦然)。好吧,在这些情况下,请继续这样做。

于 2013-11-10T02:11:27.640 回答