2011-07-14 73 views
3

我已經看到了很多不同的方法來處理/綜合int,但我不知道正確的方法。int的setter/getter的正確屬性是什麼?

我通常做的:

@property (nonatomic, assign) int myInt 

但我看到人們使用:

@property (nonatomic) int myInt 
@property int myInt 

哪條路是正確的?

回答

3

這裏是a great post about the difference between atomic and nonatomic

假設你@synthesizing的方法實施方式中,原子 與非原子的變化生成的代碼。如果你正在編寫自己的 setter/getters,atomic/nonatomic/retain/assign/copy僅僅是 諮詢。

使用原子,合成的setter/getter將確保整個 值始終從getter返回,或由設置者 設置,而不管任何其他線程上的setter活動。也就是說,如果線程 A是在吸氣的中間,而線程B調用的二傳手,一個 實際可行的價值 - 一個自動釋放的對象,最有可能的 - 將 在A.返回給調用者

在非原子,沒有這樣的保證。因此,非原子是 比原子快得多。

什麼原子不能做的是對線程安全做出任何保證。如果 線程A正在與線程B同時調用getter,並且C使用不同的值調用setter,則線程A可能會得到返回的三個值中的任何一個 - 在任何setter被調用之前的那個值被稱爲 或任一值傳入B和C中的setter。同樣, 對象可能以B或C的值結束,無法分辨。

確保數據完整性 - 多線程編程的主要挑戰之一 - 是通過其他方式實現的。

注意,默認爲atomic,所以最後一個例子相當於

@property (atomic) int myInt 

另一個默認值是assign,因此這兩個選項是相同的:

@property (nonatomic, assign) int myInt 
@property (nonatomic) int myInt 

而且,同樣,以下也相當於

@property (atomic, assign) int myInt 
@property (atomic) int myInt 

編輯:正如喬希指出的,包括atomic是一個假設的例子。

+2

你可能會提到'atomic'實際上並不存在作爲性能關鍵字,那麼第一個和最後兩個例子都是假設。 –

0

缺省值是分配和原子

0

這是一個比技術正確性問題更多的風格問題。對於int類型,具有的唯一值爲真assign修飾符(因爲您不保留標量)。否則,它是特定於上下文的:只讀或只讀,原子或非原子,取決於應用程序。

請注意,如果您未指定修飾符,則默認應用(atomic,readwrite,assign)。所以你的例子你的第一個例子是相同的,第三個只是在原子性方面有所不同。

0

@property(nonatomic,assign)int myVariable;

永遠記住分配將被用於基本數據類型,如整型,布爾

相關問題