4

我有一个 NSMutableArray,它只能由所有者对象(MyObject)修改。所以第一次尝试是让它成为一个只读属性。问题是这个类实现了 NSCoding,而 NSCoding 要求归档对象是一个读写属性。

然后我想到了拥有一个私有属性(在 m 文件中声明),并有一个返回我的私有数组的公共方法。但是这将是对数组的引用,其他类将能够修改它。

我的方法也不应该返回这个数组的副本,因为我希望其他类能够修改这个数组中的每个 item=,而不是数组本身。

问题:我怎样才能拥有一个只读的公共财产,同时能够对其进行归档和取消归档?

4

1 回答 1

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而不是抛出运行时异常的结果,那么您可以不使用副本。另一个警告是,如果没有副本,对私有数组的任何更改都将被“看到”,即使在先前获得的对所谓不可变数组的引用中也是如此。

于 2012-07-11T18:13:52.633 回答