據此:NSString property: copy or retain?NSArray屬性:複製或保留?
對於NSString/NSMutableString,建議複製。
NSArray/NSMutableArray呢?
據此:NSString property: copy or retain?NSArray屬性:複製或保留?
對於NSString/NSMutableString,建議複製。
NSArray/NSMutableArray呢?
選擇copy
,除非你有一個非常具體的原因,以及所有的支持代碼/接口來支持。
我詳細的理由和幾個含義在這裏: NSMutableString as retain/copy
這個例子是基於NSString
S,但同樣適用於NSArray
秒。
從你包括鏈接,它幾乎可以歸結爲:NSString property: copy or retain?
如果你想確保對象的值執行過程中不會改變,你可以使用copy
屬性,否則將retain
沒事的。一般而言,retain
對於NSMutableArrays和NSArrays(以及許多其他對象)將會正常,因爲您通常對對象更感興趣,然後對其所包含的值感興趣。如果是NSString你總是對價值感興趣,所以你copy
它確保它不會改變。
@jlehr:
這取決於如果開發商有興趣的實際價值或沒有。每當感興趣的實際價值,使用副本(因爲你不希望價值改變執行期間),否則保留是好的。從Apple的文檔:
Objective-C代碼中的常見做法是複製值對象 - 代表屬性的對象。 C型變量通常可以替代值對象,但值對象具有封裝常用操作的便利實用程序的優點。例如,使用NSString對象而不是字符指針,因爲它們封裝了編碼和存儲。
同樣來自蘋果的文檔,關於值的對象的主題:
值對象本質上是一個簡單的數據元素的面向對象的包裝,諸如字符串,數字或日期。 Cocoa中的公共值類是NSString,NSDate和NSNumber。值對象通常是您創建的其他自定義對象的屬性。
如果底層數據發生變化時出現問題,請使用副本。事實上,這是你大部分時間想要的,因爲改變背後的數據是錯誤的一個很好的來源。
請注意,複製本質上只是NSArray的保留。只有當你拋出一個NSMutableArray時,纔會涉及更多的工作。
既然你問的是NSArray(而不是NSMutableArray),你應該使用copy。 NSArray是不可變的,因此您不希望該類型的屬性發生更改。但NSMutableArray是NSArray的一個子類,所以對於有人傳入NSMutableArray是完全有效的。如果你只保留那個物體,那麼它可能會在你的鼻子下面變化。如果您複製而不是保留,那麼對象不會改變。
然而,你應該知道,當你複製的NSArray像一個容器,你複製容器,而不是它的內容。如果數組包含可變對象,則即使數組本身是不可變的,這些對象的內容也可能會更改。
在兩個或多個對象之間共享可變集合的內容違反了封裝,這就是Apple建議爲'NSArray'類型的屬性使用'copy'語義的原因。 – jlehr 2011-05-02 01:00:54