2011-07-26 23 views
6

一位朋友告訴我標量屬性(BOOL,NSInteger等)的@property默認是非原子的。即,Objective-C:默認爲標量屬性的原子?

@property BOOL followVenmo; 

默認爲

@property (nonatomic) BOOL followVenmo; 

但是,我一直的印象是,默認值始終原子,標與否。

這是什麼?

回答

10

請注意這個「標量」術語。 NSString *屬性也是一個指針,就像您提供的指向BOOL的指針一樣。

從蘋果文檔:(Objective-C的編程語言)

如果指定retaincopy並沒有指定nonatomic,然後在引用計數的環境,合成獲取對象屬性的訪問器使用保留並自動釋放返回的值-imp lementation將類似如下:

[_internal lock]; // lock using anobject-levellock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

不能在東西是不是一個對象適用對象級鎖,所以(非)原子對原始類型的屬性基本沒有影響。

可以得出這樣的結論原子僅適用於對象的屬性,這是在文檔增強:

如果指定nonatomic,一個合成訪問一個對象屬性簡單地返回直接值。

爲了澄清是否應該指定一個或另一個:從技術上講,沒有一個nonatomic屬性都被視爲原子,但請記住,它有原始類型沒有意義。因此,您可能需要保存一些鍵入內容,並在這些中避免nonatomic

+0

糟糕。我的意思是讓這些BOOL值,而不是指針。正在更新... – ma11hew28

+0

我還有點不清楚。那麼,我不應該爲原始類型指定'nonatomic'嗎? – ma11hew28

+0

你真的不必具有任何基元類型的屬性。他所說的是,你只需要非原子的對象,而不是原始類型。所以@property布爾someBool;工作正常。 –

-1

Developer Documentation

非原子 指定訪問器是非原子。 默認情況下, 訪問器是原子的。

原子屬性確保您將獲得或設置一個完整的值。例如,從2個線程設置一個CGRect將會以一個或另一個結束,而不是這兩個線程的組合。

對於保留的屬性,它也確保結果可以超過接收者。例如,您可以在調用完成之前從另一個線程釋放的對象中獲得結果,但結果會以您的名義保留並自動釋放,因此它仍然有效。

+1

你甚至讀過這個問題嗎? – ma11hew28

+1

您是否閱讀過文檔?答案在文檔引用中 - 所有訪問器都是原子的,不管屬性是否爲原始的。 – drawnonward