何時應該使用Objective-C中的nonatomic
,retain
,readonly
和readwrite
屬性?如何在Objective-C中使用屬性?
例如:
@property(nonatomic, retain) NSObject *myObject;
如果我使用nonatomic
和retain
,這是否意味着該對象將被保留?
何時應該使用Objective-C中的nonatomic
,retain
,readonly
和readwrite
屬性?如何在Objective-C中使用屬性?
例如:
@property(nonatomic, retain) NSObject *myObject;
如果我使用nonatomic
和retain
,這是否意味着該對象將被保留?
首先,我想將David Gelhar的評論推薦給一個完整的答案。修飾符atomic
和nonatomic
與線程安全無關。有關該空間的更多詳細信息,請參見this question。
您列出的其他項目可以相對簡單地解決。如果你想要更多的話,我會簡單地點擊它們並指向你的屬性修飾符documentation。
atomic
vs nonatomic
主要確保從合成獲取器返回完整值並且由合成設置器寫入完整值。
readwrite
vs readonly
確定合成屬性是否具有合成存取器(readwrite
有一個setter並且是默認設置,readonly
沒有)。
assign
vs retain
vs copy
確定合成訪問器如何與Objective-C內存管理方案進行交互。 assign
是默認值,只是執行變量賦值。 retain
指定新值應發送-retain
在轉讓和舊值發送-release
。 copy
指定新值應發送到-copy
分配和舊值發送-release
。
大衛,謝謝你的寫作,它也教育了我。 – 2011-03-02 19:54:47
另外,需要注意使用伊娃的制定者和獲得者,而不是直接改變伊娃,這避開了制定者和獲得者。也就是說,使用self.myValue = newValue,而不是myValue = newValue。 – 2011-03-02 19:57:43
當然,關於'self.myValue = newValue'和'myValue = newValue'的使用。如果您打算使用屬性,則需要確保使用點語法或將消息發送給自己。直接進入伊娃會損害很多。 – 2011-03-02 20:08:20
nontomic基本上,如果你說非原子,並且使用@synthesize生成訪問器,那麼如果多個線程試圖一次更改/讀取屬性,可能會發生不良情況。您可以獲得部分編寫的值或過度釋放/保留的對象,這些對象很容易導致崩潰。 (儘管這可能比原子訪問器快很多)。
原子是默認行爲。非原子是線程安全的。 只讀外部屬性將爲只讀。
readwrite屬性將具有存取器和setter。
assign(默認) - 指定setter使用簡單分配。 retain - 指定在分配時應該在對象上調用retain。該屬性僅對Objective-C對象類型有效。 (您無法指定Core基礎對象的保留)
副本 - 指定應該使用對象的副本進行分配。之前的值被髮送一個釋放消息。該副本通過調用複製方法進行。該屬性僅適用於必須實現NSCopying協議的對象類型。
如果您使用nonatomic
,讀取和寫入屬性將不是線程安全的。在這一點上,我不認爲這是你需要擔心的事情,但非原子訪問可以比原子訪問更快,這就是它在這裏使用的原因。
如果使用retain
,寫入該屬性將導致傳出值被釋放並保留傳入值,從而保持適當的基於引用計數的值的所有權。
............................請在您的問題中使用較少的時間段。 – 2011-03-02 19:14:06
[Atomic vs nonatomic properties]可能的重複(http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-properties) – 2011-03-02 19:14:40
@David我不這麼認爲。這個問題更多的是關於一般的屬性。不只是「非原子」和「原子」。 – 2011-03-02 19:16:12