Subclassing NSMutableDictionary

Ben picture Ben · Jan 25, 2011 · Viewed 9.9k times · Source

I am trying to implement a subclass of NSMutableDictionary that returns nil instead of throwing a NSUndefinedKeyException when the key is not present in the Dictionary.

However when I try to add objects to my dictionary I get

[NSMutableDictionary setObject:forKey:]: method only defined for abstract class

NilDictionary.h

@interface NilDictionary : NSMutableDictionary {
} 
@end

NilDctionary.m

@implementation NilDictionary
- (id)valueForUndefinedKey:(NSString *)key {
  return nil;
}
@end

Do I really have to implement all the methods from NSMutableDictionary again in my subclass or is there some other class I should be subclassing?

Clarification: My original problem came down to me not being able to read the documentation properly.

If you need to subclass NSMutableDictionary check out the correct answer. If you want a dictionary that returns nil when your key is not present, NSMutableDictionary does that already.

Answer

EmptyStack picture EmptyStack · Jan 25, 2011

NSMutableDictionary Class Reference says:

In a subclass, you must override both of its primitive methods:

1. setObject:forKey:
2. removeObjectForKey:

You must also override the primitive methods of the NSDictionary class.


NSDictionary Class Reference says:

If you do need to subclass NSDictionary, you need to take into account that is represented by a Class cluster—there are therefore several primitive methods upon which the methods are conceptually based:

1. count
2. objectForKey:
3. keyEnumerator
4. initWithObjects:forKeys:count:

In a subclass, you must override all these methods.

NSDictionary’s other methods operate by invoking one or more of these primitives. The non-primitive methods provide convenient ways of accessing multiple entries at once.


It seems that you need to override all these six methods to make your NSMutableDictionary subclass work perfect.