代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

如何限制NSMutableDictionary的容量?

  •  0
  • paxdiablo  · 技术社区  · 15 年前

    有没有办法创建一个有容量的可变字典 限制

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

    dictionary的capacity参数是一个初始容量,如果您添加的元素比您想要的多,那么它将简单地增加,因此不适合。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Jaanus    15 年前

    将其子类化并重写addObject以在添加之前检查计数?没有内置的方式。

    这是一个基本的例子。。。没有测试,缺少初始化等,但这是核心。您还应该覆盖设置值: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
    
        2
  •  1
  •   Jonathan Grynspan    15 年前

    没有用于此的API,但这样做的代码相当简单:

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

    请注意,上面的代码不是线程安全的,但要使其线程安全,只需将函数的内容包装到 @synchronized (array) 指令。

    如果你想要一个数组,它可以被捆绑在一起,并且内置了这个限制, 不要 NSMutableArray 类簇。 NSMUTABLEARRY可变数组 的合同(它与调用代码的“协议”)说 -addObject: 将该对象添加到数组中,而不是在数组低于某个限制时添加。

    相反,具有最大长度的数组的行为与标准行为完全不同,因此它不应该是的子类 . 这看起来像是一个发明--它是一个数组,你可以对它进行变异,因此它应该可以作为一个数组来处理 NSMUTABLEARRY可变数组 . 但是调用代码无法知道它的修改会在子类上无声地失败,并且在设计时可能不会考虑到这样的失败。

    如果调用代码是您的,您可以使用上面定义的helper函数——您知道对象可能不会被添加,您可以适当地编写代码。如果调用代码来自其他地方(例如Cocoa或其他Apple框架),请使用普通的 ,并在调用代码完成添加对象时将其剔除。

    推荐文章