Is an NSMapTable
the same as an NSMutableDictionary
except for allowing keys to be pointers?
Does it differ in memory management?
See Question&Answers more detail:osIs an NSMapTable
the same as an NSMutableDictionary
except for allowing keys to be pointers?
Does it differ in memory management?
See Question&Answers more detail:osNSMapTable is more flexible than NSDictionary. While NSDictionary keeps strong references for values and copies the keys, you can configure NSMapTable to have any of those behaviors independently for objects and values: strong, weak or copy (more behavior options exist).
A practical use case: an NSDictionary keeps a strong reference (retains) of the pointer of the value, but copies the key. This means a) the key instance must implement the NSCopying protocol and b) depending on the complexity of the class, copying might add an overhead. On the other hand, you can configure an NSMapTable to act like an NSDictionary that uses strong references for both the values and the keys, no copying or NSCopying protocol needed.
An object-to-object behavior could previously be emulated using an NSDictionary if all the keys were NSNumbers containing the memory address of the source object in the mapping (don't laugh, I've seen it done) but outside of this run-around, NSMapTable offers a true object-to-object mapping for the first time in a Cocoa collection class.
(From a great article covering NSMapTable when it was introduced.)
Let's look at the API. This will return an object that works much the same as an NSMutableDictionary:
[NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn
valueOptions:NSMapTableStrongMemory]
This will return an object that works doesn't copy the keys:
[NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory
valueOptions:NSMapTableStrongMemory]
Note: It looks like the NSMapTable API has changed in recent SDKs, but this syntax seems to be compatible with all SDKs.
NSMapTable is available on OS X 10.5+ and iOS 6.0+.