2011-05-01 36 views

回答

18

選擇copy,除非你有一個非常具體的原因,以及所有的支持代碼/接口來支持。

我詳細的理由和幾個含義在這裏: NSMutableString as retain/copy

這個例子是基於NSString S,但同樣適用於NSArray秒。

5

從你包括鏈接,它幾乎可以歸結爲:NSString property: copy or retain?

如果你想確保對象的值執行過程中不會改變,你可以使用copy屬性,否則將retain沒事的。一般而言,retain對於NSMutableArraysNSArrays(以及許多其他對象)將會正常,因爲您通常對對象更感興趣,然後對其所包含的值感興趣。如果是NSString你總是對價值感興趣,所以你copy它確保它不會改變。

@jlehr:

這取決於如果開發商有興趣的實際價值或沒有。每當感興趣的實際價值,使用副本(因爲你不希望價值改變執行期間),否則保留是好的。從Apple的文檔:

Objective-C代碼中的常見做法是複製值對象 - 代表屬性的對象。 C型變量通常可以替代值對象,但值對象具有封裝常用操作的便利實用程序的優點。例如,使用NSString對象而不是字符指針,因爲它們封裝了編碼和存儲。

同樣來自蘋果的文檔,關於值的對象的主題:

值對象本質上是一個簡單的數據元素的面向對象的包裝,諸如字符串,數字或日期。 Cocoa中的公共值類是NSString,NSDate和NSNumber。值對象通常是您創建的其他自定義對象的屬性。

+1

在兩個或多個對象之間共享可變集合的內容違反了封裝,這就是Apple建議爲'NSArray'類型的屬性使用'copy'語義的原因。 – jlehr 2011-05-02 01:00:54

9

如果底層數據發生變化時出現問題,請使用副本。事實上,這是你大部分時間想要的,因爲改變背後的數據是錯誤的一個很好的來源。

請注意,複製本質上只是NSArray的保留。只有當你拋出一個NSMutableArray時,纔會涉及更多的工作。

24

既然你問的是NSArray(而不是NSMutableArray),你應該使用copy。 NSArray是不可變的,因此您不希望該類型的屬性發生更改。但NSMutableArray是NSArray的一個子類,所以對於有人傳入NSMutableArray是完全有效的。如果你只保留那個物體,那麼它可能會在你的鼻子下面變化。如果您複製而不是保留,那麼對象不會改變。

然而,你應該知道,當你複製的NSArray像一個容器,你複製容器,而不是它的內容。如果數組包含可變對象,則即使數組本身是不可變的,這些對象的內容也可能會更改。

+4

+1關於收集對象的警告 – elitalon 2013-09-03 17:27:04

+0

@Caleb所以'@property(copy)NSArray * myArray'的唯一優點是防止數組大小發生變化?它不會阻止內容被一個在NSMutableArray中傳遞的淘氣男孩所改變。 – Pwner 2015-07-29 15:15:37

+0

@Pwner'@property(copy)'將防止數組的內容發生變化,因爲數組將繼續以相同的順序引用相同的對象,但它不會阻止個別對象本身改變。 – Caleb 2015-07-29 16:38:18