2012-10-18 33 views
0

我有一個實例數組,我將最終根據用戶設置進行更改。我設置了一個不可改變的NSArray:改變一個實例NSArray

@property (strong, nonatomic) NSArray *pointArray; 

,當我需要改變數組,我一直在做這樣的:

-(void)changePointArray 
{ 
    NSMutableArray *tempArray = [NSMutableArray arrayWithArray:self.pointArray]; 

    // Make changes 

    self.pointArray = [NSArray arrayWithArray:tempArray]; 
} 

這是可以接受的做法還是我創建一個泄漏?我應該只是簡單地說明它:

self.pointArray = (NSArray *)tempArray; 

或甚至需要擔心將NSMutableArray設置爲NSArray?

self.pointArray = tempArray; 
+0

你有沒有試過[self.pointArray mutableCopy]? – CBredlow

+1

因爲'arrayWithArray'返回一個自動釋放對象,所以你沒有泄漏 – MrBr

回答

1

不,沒有泄漏(關於內存管理)。

如果您的目標是不公開您的公共接口中的相互陣列,那麼您的代碼絕對可以。

但是,如果您不關心這裏的抽象(或者如果該屬性不公開),那麼首先宣佈NSMutualArray *類型的屬性會更容易。

1

你不必擔心這一點,因爲self.pointArray = tempArray;NSMutableArrayNSArray一個子類。也許更多的內存分配給NSMutableArray,但這根本不是問題 - 不要擔心。

當然,你仍然可以做self.pointArray = [NSArray arrayWithArray:tempArray];

,如果你有

@property (strong, nonatomic) NSMutableArray *pointArray;

,你試圖做self.pointArray = tempArray;是tempArray你將不得不在相反的情況下的問題,雖然是NSArray*

如果您嘗試做self.pointArray = (NSMutableArray*)tempArray;在這種情況下您會遇到問題

0

如果內容可以更改或修改,那麼最好的解決方案是使用NSMutableArray而不是NSArray

如果您有任何使用NSArray的具體原因,那麼下面的代碼是最好的解決方案。

self.pointArray = [NSArray arrayWithArray:tempArray]; 
2

您有什麼擔憂?對於這種情況,人們可能會關心原子性,針對其他人修改陣列的安全性,或者兩者兼而有之。如果您不關心,只需將您的屬性設置爲NSMutableArray並將其修改即可。

如果你擔心原子,你應該做一個拷貝,修改副本,然後將其交換(但是,當然,對象的所有用戶都必須知道,使指針自己的私有副本對於一系列「原子」引用,vs對每個引用重新引用屬性)。

爲了安全起見,您應該使數組成爲不可變的NSArray並使屬性爲只讀。

+0

是的,我不確定是否使用實例可變數組是一個禁忌或不是,所以我做了一個快速的谷歌搜索。發現一些人因爲這些原因而建議在不變的情況下作出推薦。沒有考慮將其設置爲只讀。 TBH,我不需要擔心這個程序的原子性,但我認爲這將是一個好習慣。 – Padin215

+0

@ Log139 - 當然,對於99%的應用來說,「安全性」並不重要,因爲一小部分人可以訪問所有來源並可以更改任何內容。無論如何,Objective-C並不是真正的「安全」。 「安全」確實只能防止意外修改,「哎呀,我真的應該這樣做'正確'的方式,但我沒有時間修改。 –

相關問題