Search code examples
iphoneobjective-ciosnsmutabledictionarysubclassing

Subclassing NSMutableDictionary


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.


Solution

  • 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.