2010-04-05 53 views
0

我知道你不應該使用這個來決定是否要更改數組:假設有關NSMutableArray/NSArray類集羣的安全性是什麼?

if ([possiblyMutable isKindOfClass:[NSMutableArray class]]) 

但是說我正在寫一個方法,需要在回報的NSMutableArrayNSArray,取決於易變性possiblyMutable。使用我的方法的類已經知道是否可以更改返回的數組。是否可以改變返回的數組直接與是否可以改變possiblyMutable相關。

在這種特定情況下,此代碼是否安全?在我看來,如果它是而不是可以接受更改數組,但我們意外地得到了一個可變數組,但沒關係,因爲使用我的方法的類不會嘗試更改它。如果它可以接受改變陣列,那麼我們將總是得到possiblyMutable作爲NSMutableArray(雖然這是我不完全清楚的部分)。

那麼......安全還是不安全?備擇方案?

+0

如果你確實需要一個可變數組,那麼爲什麼不使用'-mutableCopy'? – kennytm 2010-04-05 19:07:50

回答

4

編號不安全。

如果你這樣做:

NSMutableArray * ma = [NSMutableArray arrayWithObject:@"foo"]; 
NSArray * aa = [NSArray arrayWithObject:@"foo"]; 

NSLog(@"Mutable: %@", [ma className]); 
NSLog(@"Normal: %@", [aa className]); 

然後你得到:

2010-04-05 13:17:26.928 EmptyFoundation [55496:A0F]易變:NSCFArray
2010-04- 05 13:17:26.956 EmptyFoundation [55496:A0F]正常:NSCFArray

你也可以這樣做:

NSLog(@"Mutable add: %d", [ma respondsToSelector:@selector(addObject:)]); 
NSLog(@"Normal add: %d", [aa respondsToSelector:@selector(addObject:)]); 

由於此記錄:

2010-04-05 13:18:35.351 EmptyFoundation [55525:A0F]易變添加:1
2010-04-05 13:18:35.351 EmptyFoundation [ 55525:A0F]正常加:1個

,確保您有一個可變的數組的唯一途徑是利用現有陣列的-mutableCopy或者如果一個函數/方法的返回類型保證陣列將是可變的。

+3

爲了更明確一點,不應該出現這樣的情況,即對待可變數組和正常數組的處理方式不同。要做到這一點,你必須專門傳遞有關陣列可變性的信息,這是一個脆弱的設計噩夢。否則,你應該總是複製或mutableCopy數組取決於你想要的。 – Chuck 2010-04-05 19:24:32

+0

那NSCoding是如何工作的呢?說我有一個可變數組的數組,我編碼它。解碼後,我是否需要遍歷數組並將mutableCopy發送給每個子陣列? – andyvn22 2010-04-05 20:00:54

+1

不,NSCFArray在內部跟蹤自己的可變性(作爲私有實現細節)。 NSCoding會做正確的事情,因爲NSCFArray可以定義自己的編碼和解碼。 – 2010-04-05 20:30:40

相關問題