Objective-C - readonly NSMutableArray 和 NSCoding?

4

我有一个NSMutableArray,只能由所有者对象(MyObject)进行修改。所以第一次尝试是将其设置为只读属性。

问题在于,这个类实现了NSCoding,而NSCoding要求归档的对象必须是可读写的属性。

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

我的方法也不应该返回此数组的副本,因为我希望其他类能够修改此数组中的每个项目,但不能修改数组本身。

问题: 我如何拥有一个公共只读属性,同时又能够进行归档和取消归档?


其他类仍然可以修改可变数组,即使它是只读属性。唯一只读的是指针本身。数组内部的对象可以从外部自由地进行修改。 - David Rönnqvist
我想要能够修改数组中的项目,但我想要避免其他类向该数组添加和删除对象。 - aryaxt
1
如果您将数组公开为可变的(即使只是只读的),其他类也将能够向数组中添加或删除项目。 - David Rönnqvist
好的,你是正确的,readonly 是指属性而不是对象本身。 - aryaxt
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 的变异方法时发出警告,而不是抛出运行时异常,那么你可以不使用副本。但需要注意的是,如果没有副本,则对私有数组的任何更改甚至会在先前获取的对所谓不可变数组的引用中“可见”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接