objective-c – readonly属性总是“原子”吗?

有时我们有一个简单的readOnly属性,其值可能会发生变化
@property (readonly) NSFetchedResultsController * FetchController;
@property (readonly) NSFetchRequest * FetchRequest;
@property (readonly) nspredicate * KeywordPredicate;

我想当值改变时,它会通过某种简单的指针操作眨眼间完成.就像是

_FetchRequest = newFetchRequest;

改变的实际过程可能会发生很大变化,但实际变化应该在那一行上.

问题是,这样简单的指针赋值总是原子的吗?如果那一行实际上由几行机器代码组成并且有人要求这些机器代码间的属性怎么办?

最后,问题是指针上的简单赋值运算符是否总是原子的.

如果是这样,当它是原子的,什么不是?当然,简单赋值运算符对于复杂对象不是原子的.

那么简单的一行赋值运算符到底是什么原子?对于指针和原始类型,它会永远是吗?

解决方法

将只读操作视为原子性的,这是一种常见的误解.这不保证.这也是一个常见的误解,即 atomicity guarantees thread safety,但这是一个不同的主题.

readonly属性上的原子和非原子之间的区别在于atomic(认情况下,但未声明)保证从readonly检索方法返回的值是完整的.

也就是说,如果它是一个对象,它将被保留并自动释放.如果它是结构,则将使用适当的锁来确保返回结构的整数值.

请注意,仅仅因为属性是公开读取的,并不排除将其重新声明为readwrite以供内部使用.因此,原子和非原子之间的差异可能非常显着;类可以将readonly属性声明为非原子属性,同时还记录该类上的所有API必须仅从一个线程使用.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...