菜鸟教程小白 发表于 2022-12-11 20:45:08

ios - 原子属性和非原子属性有什么区别?


                                            <p><p><code>atomic</code> 和 <code>nonatomic</code> 在属性声明中是什么意思?</p>

<pre><code>@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;
</code></pre>

<p>这三者在操作上有什么区别?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>最后两个是相同的; “atomic”是默认行为(<strike>请注意,它实际上不是关键字;它仅由缺少 <code>nonatomic</code></strike> 指定 -- <code>atomic</code>在最近的 llvm/clang 版本中被添加为关键字)。</p>

<p>假设您正在@synthesizing 方法实现,原子与非原子会更改生成的代码。如果您正在编写自己的 setter/getter,则 atomic/nonatomic/retain/assign/copy 只是建议性的。 (注意:@synthesize 现在是 LLVM 最新版本中的默认行为。也不需要声明实例变量;它们也会自动合成,并且会在其名称前加上 <code>_</code>以防止意外的直接访问)。</p>

<p>使用“原子”,合成的 setter/getter 将确保始终从 getter 返回或由 setter 设置一个<em>整个</em>值,而不管任何其他线程上的 setter 事件。也就是说,如果线程 A 位于 getter 的中间,而线程 B 调用 setter,则实际可行的值(很可能是自动释放的对象)将返回给 A 中的调用者。</p>

<p>在 <code>nonatomic</code> 中,没有做出这样的保证。因此,<code>nonatomic</code> 比“atomic”快得多。</p>

<p><strong>不</strong>所做的“原子”所做的是对线程安全做出任何保证。如果线程 A 同时调用 getter,而线程 B 和 C 使用不同的值调用 setter,则线程 A 可能会返回三个值中的任何一个——在调用任何 setter 之前的那个值或传递给 setter 的值中的任何一个在 B 和 C 中。同样,对象可能以 B 或 C 中的值结束,无法判断。</p>

<p>确保数据完整性——多线程编程的主要挑战之一——是通过其他方式实现的。</p>

<p>补充:</p>

<p><code>atomicity</code> 单个属性的<code>atomicity</code> 也不能保证多个依赖属性在使用时的线程安全。</p>

<p>考虑:</p>

<pre><code> @property(atomic, copy) NSString *firstName;
@property(atomic, copy) NSString *lastName;
@property(readonly, atomic, copy) NSString *fullName;
</code></pre>

<p>在这种情况下,线程 A 可以通过调用 <code>setFirstName:</code> 然后调用 <code>setLastName:</code> 来重命名对象。同时,线程 B 可能会在线程 A 的两次调用之间调用 <code>fullName</code>,并会收到新的名字和旧的姓氏。</p>

<p>要解决这个问题,您需要一个<em>事务模型</em>。 IE。某种其他类型的同步和/或排除,允许在更新依赖属性时排除对 <code>fullName</code> 的访问。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 原子属性和非原子属性有什么区别?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/53028306/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/53028306/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 原子属性和非原子属性有什么区别?