Objective-C-只读NSMutableArray和NSCoding?
我有一个NSMutableArray,它应该只由所有者对象(MyObject)修改。因此,第一个尝试是使其成为只读属性。 问题是此类实现了NSCoding,而NSCoding要求归档对象是readwrite属性 然后,我考虑使用一个私有属性(在m文件中声明),并使用一个公共方法返回我的私有数组。但这将是对数组的引用,其他类将能够修改它 我的方法也不应该返回此数组的副本,因为我希望其他类能够修改此数组中的每个item=,而不是数组本身Objective-C-只读NSMutableArray和NSCoding?,objective-c,readonly,nscoding,Objective C,Readonly,Nscoding,我有一个NSMutableArray,它应该只由所有者对象(MyObject)修改。因此,第一个尝试是使其成为只读属性。 问题是此类实现了NSCoding,而NSCoding要求归档对象是readwrite属性 然后,我考虑使用一个私有属性(在m文件中声明),并使用一个公共方法返回我的私有数组。但这将是对数组的引用,其他类将能够修改它 我的方法也不应该返回此数组的副本,因为我希望其他类能够修改此数组中的每个item=,而不是数组本身 问题:我如何拥有一个只读的公共属性,同时能够对其进行存档和取消
问题:我如何拥有一个只读的公共属性,同时能够对其进行存档和取消存档?有几种方法可以做到这一点,但一种合理的方法是维护一个私有的可变数组,然后为公众提供一个只读访问器。然后让公共访问器返回内部数组的不可变副本。看起来是这样的: 在.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
的结果上调用变异方法的代码发出警告,而不是抛出运行时异常,则可以不使用副本。另一个警告是,如果没有副本,即使在先前获得的对假定不可变数组的引用中,也会“看到”对私有数组的任何更改。其他类仍然能够修改可变数组,即使它是只读属性。唯一的只读对象是指针本身。数组中的对象可以从外部自由修改。我希望能够修改数组中的项,我试图避免的是其他类在此数组中添加和删除对象。如果将数组公开为可变(即使是只读)数组,则其他类将能够从数组中添加或删除项,没错,readonly指的是属性,而不是对象本身