2011-12-30 53 views
4

我有一個模型類,其中包含一個NSMutable對象數組。控制器類需要訪問這個數組,但是該訪問只能是隻讀的。如何將NSMutableArray作爲NSArray公開爲方法的返回類型

這應該如何實施?模型應該將數組作爲(只讀)NSMutable數組公開並使用const,或者將其公開爲NSArray?如果後者如何能夠從NSMutableArray高效地創建NSArray,即NSArray應該如何包含對NSMutableArray /它的內容的引用而不是具有重複的副​​本? (當控制器訪問它時,NSMutableArray保證存儲在內存中)。

回答

11

您可以只返回你的NSMutableArray直接:

- (NSArray *)method 
{ 
    return myMutableArray; 
} 

NSMutableArrayNSArray子類,因此該控制器將能夠在其上已經執行所有的NSArray操作。如果你真的擔心有人可能會試圖拉你的技巧,你可以使用:

return [NSArray arrayWithArray:myMutableArray]; 

返回一個不可變的副本。

+0

+1 - 請記住使用dot accessor語法會導致性能下降,所以我寧願選擇第一個變體;) – matm 2013-09-19 11:16:19

1

NSMutableArray從NSArray繼承,所以除了(可能隱含地)將它轉換爲NSArray外,沒有什麼可以將NSMutableArray公開爲NSArray。請注意,它仍然是同一個對象,所以如果有人想要聰明,他們可以下調它,甚至只是試圖調用它的NSMutableArray方法。

2

沒有隻讀的NSMutableArray。如果您認爲將屬性定義爲只讀,會使返回的對象不可變,但事實並非如此。

公開一個只讀型的NSArray的財產,並在訪問返回一個新的數組如下:

return [NSArray arrayWithArray:mutableArray]; 

請注意,數組內的對象,如果可變的,將仍然是變化的。

0

雖然這可能是矯枉過正,但您可以創建自己的具有@private ivar數組的自定義類,然後可以創建只讀屬性/方法來訪問數據。

即(執行片段):

@interface CustomArray : NSObject 
{ 
    @private 
    NSArray *array; 
} 

@end 

- (id)initWithNSArray:(NSMutableArray *)array; 

- (id)getObjectAtIndex:(int)index; 

@implementation 

// implement methods here 

@end 
2

如果你想繼續通過你的可變數組,但要確保其他方法不會覆蓋現有的陣列,你總是可以通過副本

return [myMutableArray copy]; 

這樣,您返回一個NSArray類型(因爲NSMutableArray是一個子類)並確保myMutableArray本身沒有被篡改。