一位朋友告訴我標量屬性(BOOL,NSInteger等)的@property默認是非原子的。即,Objective-C:默認爲標量屬性的原子?
@property BOOL followVenmo;
默認爲
@property (nonatomic) BOOL followVenmo;
但是,我一直的印象是,默認值始終原子,標與否。
這是什麼?
一位朋友告訴我標量屬性(BOOL,NSInteger等)的@property默認是非原子的。即,Objective-C:默認爲標量屬性的原子?
@property BOOL followVenmo;
默認爲
@property (nonatomic) BOOL followVenmo;
但是,我一直的印象是,默認值始終原子,標與否。
這是什麼?
基於我的其他幾個相關問題的研究:
我應@Rhubarb's recommendation恪守:
作爲一個經驗法則,如果你不需要多線程的支持 - 你通常不會這樣做在UIViewControllers之類的UI代碼中工作,然後將其全部聲明爲非原子。
請注意這個「標量」術語。 NSString *屬性也是一個指針,就像您提供的指向BOOL的指針一樣。
從蘋果文檔:(Objective-C的編程語言)
如果指定
retain
或copy
並沒有指定nonatomic
,然後在引用計數的環境,合成獲取對象屬性的訪問器使用鎖和保留並自動釋放返回的值-imp lementation將類似如下:
[_internal lock]; // lock using an
object-level
lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;
不能在東西是不是一個對象適用對象級鎖,所以(非)原子對原始類型的屬性基本沒有影響。
可以得出這樣的結論原子僅適用於對象的屬性,這是在文檔增強:
如果指定
nonatomic
,一個合成訪問一個對象屬性簡單地返回直接值。
爲了澄清是否應該指定一個或另一個:從技術上講,沒有一個nonatomic
屬性都被視爲原子,但請記住,它有原始類型沒有意義。因此,您可能需要保存一些鍵入內容,並在這些中避免nonatomic
。
非原子 指定訪問器是非原子。 默認情況下, 訪問器是原子的。
原子屬性確保您將獲得或設置一個完整的值。例如,從2個線程設置一個CGRect將會以一個或另一個結束,而不是這兩個線程的組合。
對於保留的屬性,它也確保結果可以超過接收者。例如,您可以在調用完成之前從另一個線程釋放的對象中獲得結果,但結果會以您的名義保留並自動釋放,因此它仍然有效。
你甚至讀過這個問題嗎? – ma11hew28
您是否閱讀過文檔?答案在文檔引用中 - 所有訪問器都是原子的,不管屬性是否爲原始的。 – drawnonward
糟糕。我的意思是讓這些BOOL值,而不是指針。正在更新... – ma11hew28
我還有點不清楚。那麼,我不應該爲原始類型指定'nonatomic'嗎? – ma11hew28
你真的不必具有任何基元類型的屬性。他所說的是,你只需要非原子的對象,而不是原始類型。所以@property布爾someBool;工作正常。 –