2012-07-11 109 views
4

我有一個NSMutableArray,應該只能被所有者對象(MyObject)修改。所以第一個嘗試就是讓它成爲只讀屬性。 問題是這個類實現了NSCoding,並且NSCoding要求歸檔對象是一個readwrite屬性。Objective-C - 只讀NSMutableArray和NSCoding?

後來我想有一個私人財產(米文件中聲明),並有回我的私人陣列的公共方法。但是,這將是對數組的引用,其他類將能夠對其進行修改。

我的方法不應該返回這個數組的副本或者,是因爲我希望其他類能夠修改每個項目=這個數組中,而不是數組本身。

問題:我該如何擁有一個只讀的公共財產,同時能夠存檔和取消存檔?

+0

其他類仍然能夠修改,即使它的只讀屬性的可變數組。唯一隻讀的是指針本身。數組內的對象可以從外部自由修改。 – 2012-07-11 18:14:00

+0

我希望能夠修改數組中的項目,正是我想避免是其他類如果暴露陣列作爲可變的(只被讀取,即使)從這個數組 – aryaxt 2012-07-11 18:14:55

+1

添加和刪除對象的其他類_will be_能夠添加或刪除數組中的項目 – 2012-07-11 18:21:33

回答

4

有幾個方法可以做到這一點,但一個合理的辦法是維持一個私人的,可變數組,然後爲公衆提供只讀訪問。然後你只需要公共訪問器返回一個內部數組的不可變副本。這將是這個樣子:

在.h文件:

@interface MyClass : NSObject 

@property (readonly) NSArray *publicArray; 

@end 

在.m文件:

@interface MyClass() 

@property NSMutableArray *privateArray; 

@end 

@implementation MyClass 

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key 
{ 
    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key]; 

    if ([key isEqualToString:@"publicArray"]) { 
     keyPaths = [keyPaths setByAddingObject:@"privateArray"]; 
    } 

    return keyPaths; 
} 


@synthesize privateArray = _privateArray; 

- (NSArray *)publicArray { return [self.privateArray copy]; } 

@end 

,如果你感到舒適的票你可以沒有副本編譯器警告有關嘗試對-publicArray的結果調用突變方法的代碼,而不是拋出運行時異常。另一個需要注意的是,如果沒有副本,即使在先前獲得的對所謂的不可變陣列的引用中,私有數組的任何更改都將被「看到」。