NSMapTable
是否与 NSMutableDictionary
相同,只是允许键为指针?
它在内存管理上有什么不同吗?
最佳答案
NSMapTable 比 NSDictionary 更灵活。虽然 NSDictionary 为值保留强引用并复制键,但您可以将 NSMapTable 配置为具有独立于对象和值的任何这些行为:强、弱或复制(存在更多行为选项)。
一个实际用例:NSDictionary 保持对值指针的强引用(保留),但复制键。这意味着 a) 关键实例必须实现 NSCopying 协议(protocol)和 b) 根据类的复杂性,复制可能会增加开销。另一方面,您可以将 NSMapTable 配置为像 NSDictionary 一样,对值 和 键使用强引用,不需要复制或 NSCopying 协议(protocol)。
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.)
让我们看一下 API。这将返回一个与 NSMutableDictionary 非常相似的对象:
[NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn
valueOptions:NSMapTableStrongMemory]
这将返回一个不复制键的有效对象:
[NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory
valueOptions:NSMapTableStrongMemory]
注意:看起来 NSMapTable API 在最近的 SDK 中发生了变化,但这种语法似乎与所有 SDK 兼容。
NSMapTable 适用于 OS X 10.5+ 和 iOS 6.0+。
关于objective-c - NSMapTable 和 NSMutableDictionary 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6904533/