2013-07-21 47 views
1

我有一個Objective-C類,專用於複製語義。爲Objective-C類的用戶強制執行複製語義

@property (copy) ViewState* viewState; 

這不是一成不變的,而是掛在一個ViewState實例一切都需要自己的獨特的副本。事實上,如果其他類錯誤地嘗試

@property (strong) ViewState* viewState; 

我們最終會崩潰。

我們如何強制或鼓勵客戶端類使用正確的語義?

在C++中,例如,我們可以禁止轉讓

private: 
CPViewState* operator=(const CPViewState*) const; // no implementation 

但是,我們不能這樣做,在Objective-C。對於相反的情況,如果我們想禁止複製,我們可以記錄錯誤或從copyWithZone:中拋出異常。

我該如何要求複製語義,或者至少讓未來的開發人員清楚他們想使用複製語義?

+0

你是什麼意思「如果其他班級錯誤地嘗試[...]」?你在談論子類嗎? –

+0

MyWindow有一個ViewState。後來,有人編寫了MyWindowManager,它跟蹤每個窗口的ViewState並執行其他操作。我想確保MyWindowManager的作者知道她應該將她的實例變量定義爲@property(copy)...,而不是@property(strong)。 –

+0

這種東西只能修改編譯器。如果您在類文檔中寫入實例應該被複制並且未被分配,就足夠了。 –

回答

0

正如你正確解釋的那樣,複製語義不能從類本身強制執行。

根據創建ViewState對象的位置和方式,以及這在意思上是什麼意思,有不同的東西可以工作。

我不確定ViewState在您的項目中的含義,但是如果有意義的話,您可以提供一個Singleton/Factory ViewStateFactory類,該類有幾個創建和/或複製客戶端將使用的ViewState對象的方法。 ViewStateFactory可以確保每次客戶端請求ViewState對象時都會提供新副本。

請注意,這是爲您的班級的客戶添加了一些樣板。它也不會阻止人們進入ViewStateFactory並直接分配和/或引用ViewState對象。但它可以使你的意圖更清楚,並且你希望其他人如何使用你的班級。