有几个方法可以做到这一点,但一个合理的办法是维持一个私人的,可变数组,然后为公众提供只读访问。然后你只需要公共访问器返回一个内部数组的不可变副本。这将是这个样子:
在.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
的结果调用突变方法的代码,而不是抛出运行时异常。另一个需要注意的是,如果没有副本,即使在先前获得的对所谓的不可变阵列的引用中,私有数组的任何更改都将被“看到”。
其他类仍然能够修改,即使它的只读属性的可变数组。唯一只读的是指针本身。数组内的对象可以从外部自由修改。 – 2012-07-11 18:14:00
我希望能够修改数组中的项目,正是我想避免是其他类如果暴露阵列作为可变的(只被读取,即使)从这个数组 – aryaxt 2012-07-11 18:14:55
添加和删除对象的其他类_will be_能够添加或删除数组中的项目 – 2012-07-11 18:21:33