我已經看到了很多不同的方法來處理/綜合int,但我不知道正確的方法。int的setter/getter的正確屬性是什麼?
我通常做的:
@property (nonatomic, assign) int myInt
但我看到人們使用:
@property (nonatomic) int myInt
@property int myInt
哪條路是正確的?
我已經看到了很多不同的方法來處理/綜合int,但我不知道正確的方法。int的setter/getter的正確屬性是什麼?
我通常做的:
@property (nonatomic, assign) int myInt
但我看到人們使用:
@property (nonatomic) int myInt
@property int myInt
哪條路是正確的?
這裏是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
是一個假設的例子。
缺省值是分配和原子
這是一個比技術正確性問題更多的風格問題。對於int類型,具有的唯一值爲真assign
修飾符(因爲您不保留標量)。否則,它是特定於上下文的:只讀或只讀,原子或非原子,取決於應用程序。
請注意,如果您未指定修飾符,則默認應用(atomic,readwrite,assign)。所以你的例子你的第一個例子是相同的,第三個只是在原子性方面有所不同。
@property(nonatomic,assign)int myVariable;
永遠記住分配將被用於基本數據類型,如整型,布爾
你可能會提到'atomic'實際上並不存在作爲性能關鍵字,那麼第一個和最後兩個例子都是假設。 –