2012-07-11 89 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的结果调用突变方法的代码,而不是抛出运行时异常。另一个需要注意的是,如果没有副本,即使在先前获得的对所谓的不可变阵列的引用中,私有数组的任何更改都将被“看到”。