[英]IOS, ARC, Property: (readwrite, nonatomic) vs (radwrite, retain, nonatomic)
[英]Atomic property of a nonatomic primitive vs. nonatomic property of an atomic primitive?
我有一個關於屬性的問題,例如:
@property (atomic, assign) NSInteger variable;
是,如果我忘記了它的原子性,可以直接引用ivar並撤消該原子性。 但是,如果我聲明:
@property (nonatomic, assign) _Atomic(NSInteger) variable;
然后,無論我使用的是getter / setter還是訪問ivar,總是原子的,對嗎? 那么我們應該選擇后者嗎? 我的單線程基准測試表明這兩個設置程序的速度相似,盡管我不知道這是否會根據並發發生變化。
我不確定您的問題是否有明確的答案,但是由於在撰寫本文時沒有其他答案,我將提供以下內容,希望對您有所幫助。
在大約2009年的Objective-C 2.0中引入了已聲明的屬性以及nonatomic
限定符(默認情況下,屬性是原子且不存在atomic
) _Atomic()
來自C11,大約在2011年。
因此,我們有兩個獨立的語言開發解決原子性問題。
盡管沒有對Objective-C進行嚴格定義,但整個語言的最后“規范”可追溯到2009年,盡管此后有所擴展,但我不知道有任何規范討論C的原子特性與Objective-C的原子特性如何相互作用。 因此,與許多Objective-C問題一樣,這取決於編譯器的工作。
在針對Intel的當前Xcode 8.x編譯器看來,對於atomic
和_Atomic()
所有組合,似乎都遵循尊重原子性的代碼,至少128位(此答案的測試限制_Atomic()
–盡管同時指定兩者在某種程度上是多余的。 為atomic
產生的代碼更可能涉及自旋鎖,當然也涉及函數調用。 而_Atomic()
更可能使用CPU交換指令並內聯編譯。
那么我們應該選擇后者嗎? [
_Atomic()
]
如果您打算使用直接訪問后備變量的方法,那么我將跳過任何關於優缺點的討論,否則可能會跳過。
如果您不打算直接訪問backing變量,則使用Atomic()
可能會將一個自旋鎖調用交換為單個cpu指令,每個指令都有其自己的影響,因此任何優先選擇都取決於您如何權衡它們。
簡而言之:YMMV,以上內容適用於Intel,Xcode 8.x等。希望這是一些幫助,一個有趣的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.