Objective-C-只读NSMutableArray和NSCoding?

Objective-C-只读NSMutableArray和NSCoding?,objective-c,readonly,nscoding,Objective C,Readonly,Nscoding,我有一个NSMutableArray,它应该只由所有者对象(MyObject)修改。因此,第一个尝试是使其成为只读属性。 问题是此类实现了NSCoding,而NSCoding要求归档对象是readwrite属性 然后,我考虑使用一个私有属性(在m文件中声明),并使用一个公共方法返回我的私有数组。但这将是对数组的引用,其他类将能够修改它 我的方法也不应该返回此数组的副本,因为我希望其他类能够修改此数组中的每个item=,而不是数组本身 问题:我如何拥有一个只读的公共属性,同时能够对其进行存档和取消

我有一个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指的是属性,而不是对象本身