2011-03-02 124 views
7

何時應該使用Objective-C中的nonatomic,retain,readonlyreadwrite屬性?如何在Objective-C中使用屬性?

例如:

@property(nonatomic, retain) NSObject *myObject; 

如果我使用nonatomicretain,這是否意味着該對象將被保留?

+0

............................請在您的問題中使用較少的時間段。 – 2011-03-02 19:14:06

+0

[Atomic vs nonatomic properties]可能的重複(http://stackoverflow.com/questions/588866/atomic-vs-nonatomic-properties) – 2011-03-02 19:14:40

+0

@David我不這麼認爲。這個問題更多的是關於一般的屬性。不只是「非原子」和「原子」。 – 2011-03-02 19:16:12

回答

10

首先,我想將David Gelhar的評論推薦給一個完整的答案。修飾符atomicnonatomic與線程安全無關。有關該空間的更多詳細信息,請參見this question

您列出的其他項目可以相對簡單地解決。如果你想要更多的話,我會簡單地點擊它們並指向你的屬性修飾符documentation

atomic vs nonatomic主要確保從合成獲取器返回完整值並且由合成設置器寫入完整值。

readwrite vs readonly確定合成屬性是否具有合成存取器(readwrite有一個setter並且是默認設置,readonly沒有)。

assign vs retain vs copy確定合成訪問器如何與Objective-C內存管理方案進行交互。 assign是默認值,只是執行變量賦值。 retain指定新值應發送-retain在轉讓和舊值發送-releasecopy指定新值應發送到-copy分配和舊值發送-release

+0

大衛,謝謝你的寫作,它也教育了我。 – 2011-03-02 19:54:47

+1

另外,需要注意使用伊娃的制定者和獲得者,而不是直接改變伊娃,這避開了制定者和獲得者。也就是說,使用self.myValue = newValue,而不是myValue = newValue。 – 2011-03-02 19:57:43

+0

當然,關於'self.myValue = newValue'和'myValue = newValue'的使用。如果您打算使用屬性,則需要確保使用點語法或將消息發送給自己。直接進入伊娃會損害很多。 – 2011-03-02 20:08:20

1

nontomic基本上,如果你說非原子,並且使用@synthesize生成訪問器,那麼如果多個線程試圖一次更改/讀取屬性,可能會發生不良情況。您可以獲得部分編寫的值或過度釋放/保留的對象,這些對象很容易導致崩潰。 (儘管這可能比原子訪問器快很多)。

原子是默認行爲。非原子是線程安全的。 只讀外部屬性將爲只讀。

readwrite屬性將具有存取器和setter。

assign(默認) - 指定setter使用簡單分配。 retain - 指定在分配時應該在對象上調用retain。該屬性僅對Objective-C對象類型有效。 (您無法指定Core基礎對象的保留)

副本 - 指定應該使用對象的副本進行分配。之前的值被髮送一個釋放消息。該副本通過調用複製方法進行。該屬性僅適用於必須實現NSCopying協議的對象類型。

+5

atomic!=「線程安全」。它只是意味着原子。任何共享公共數據的多線程算法都需要同步以避免競爭條件,即使是原子性的。 – Bogatyr 2011-03-02 19:38:26

+0

@Bogatyr:謝謝 – iHS 2011-03-02 19:46:59

+1

雖然如果你真的不關心精確排序,如果你有一個作者和多個讀者在不同的線程中,「atomic」就足夠好,所以在這個意義上它可以被認爲是「線程安全的」 – Bogatyr 2011-03-02 20:55:01

2

如果您使用nonatomic,讀取和寫入屬性將不是線程安全的。在這一點上,我不認爲這是你需要擔心的事情,但非原子訪問可以比原子訪問更快,這就是它在這裏使用的原因。

如果使用retain,寫入該屬性將導致傳出值被釋放並保留傳入值,從而保持適當的基於引用計數的值的所有權。