有几种方法可以做到这一点,但一种合理的方法是维护一个私有的、可变的数组,然后为公众提供一个只读访问器。然后,您只需让公共访问器返回内部数组的不可变副本。看起来像这样:
在 .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
而不是抛出运行时异常的结果,那么您可以不使用副本。另一个警告是,如果没有副本,对私有数组的任何更改都将被“看到”,即使在先前获得的对所谓不可变数组的引用中也是如此。