我们如何限制NSMutableDictionary的容量?

时间:2010-08-23 05:19:27

标签: nsdictionary nsmutabledictionary capacity

有没有办法创建容量 limit 而不是初始容量的可变字典?

假设您要创建一个最多只有100个条目的字典。

字典的容量参数是一个初始容量,如果你添加的元素超出你想要的范围,它将会简单地增加。所以它不适合。

2 个答案:

答案 0 :(得分:2)

对它进行子类化并覆盖addObject以在添加之前检查计数?没有内置的方式。

这是一个基本的例子......未经测试,缺少init等,但这是核心。您还应该以类似的方式覆盖setValue:forKey:

@interface MyMutableDictionary: NSMutableDictionary

- (BOOL) setObject:(id)anObject forKey:(id)aKey;

@end

@implementation MyMutableDictionary

- (BOOL) setObject:(id)anObject forKey:(id)key {
    if ([self count] < yourLimit) {
        [super setObject:anObject forKey:key];
        return YES;
    }
    return NO;
}

@end

答案 1 :(得分:1)

没有这方面的API,但执行此操作的代码非常简单:

void AddObjectToArray(NSMutableArray *array, id obj, NSUInteger maxCount) {
    if ([array count] < maxCount)
        [array addObject: obj];
}

请注意,上面的代码不是线程安全的,但使其线程安全就像将函数的内容包装在@synchronized (array)指令中一样简单。

如果您想要一个可以绑定并且内置此限制的数组,继承NSMutableArray类集群。 NSMutableArray的契约(它与调用代码的“协议”)表示对-addObject:的调用会将该对象添加到数组中,而不是在数组受限制时将其添加。 / p>

相反,具有最大长度的数组的行为与标准行为不同,它不应该是NSMutableArray的子类。这可能看起来像一个设计 - 它是一个数组,你可以改变它,因此它应该被视为NSMutableArray。但调用代码无法知道它的修改将在您的子类上静默失败,并且可能不会在设计时考虑到这些失败。

如果调用代码是你的,你可以使用上面定义的辅助函数 - 你知道可能没有添加对象,你可以适当地编码。如果调用代码来自其他地方(例如Cocoa或其他Apple框架),请使用普通NSMutableArray,并在调用代码完成添加对象时剔除它。