NSMapTable
是否与NSMutableDictionary
相同,只是允许键是指针?
内存管理是否有所不同?
答案 0 :(得分:25)
NSMapTable比NSDictionary更灵活。虽然NSDictionary保留了对值的强引用和复制键,但您可以将NSMapTable配置为独立于对象和值具有任何这些行为:强,弱或复制(存在更多行为选项)。
实际用例:NSDictionary保留了值的指针的强引用(保留),但复制键。这意味着a)密钥实例必须实现NSCopying协议,b)根据类的复杂性,复制可能会增加开销。另一方面,您可以将NSMapTable配置为像NSDictionary一样,对值和使用强引用,不需要复制或NSCopying协议。
以前可以使用a来模拟对象到对象的行为 NSDictionary如果所有键都是包含内存的NSNumbers 映射中源对象的地址(不要笑,我已经看过了 完成)但在这种复出之外,NSMapTable提供了一个真实的 在Cocoa集合中第一次进行对象到对象的映射 类。
(来自a great article covering NSMapTable when it was introduced。)
让我们来看看API。这将返回一个与NSMutableDictionary非常相似的对象:
[NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn
valueOptions:NSMapTableStrongMemory]
这将返回一个无法复制键的对象:
[NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory
valueOptions:NSMapTableStrongMemory]
注意:在最近的SDK中看起来NSMapTable API已经发生了变化,但是这种语法似乎与所有SDK兼容。
NSMapTable适用于OS X 10.5+和iOS 6.0 +。
答案 1 :(得分:3)
或多或少,它有一些主要相关的选项,如果你使用垃圾收集(我猜这是一种不推荐使用)。如果您不使用垃圾收集,则内存管理要求是相同的。
另一个区别是NSMapTable
可以选择使用指针相等来进行散列。
答案 2 :(得分:0)
请注意,如果使用弱弱,弱强或弱弱绑定,NSMapTable有时不会释放键和对象{。{3}}。
同样在NSMapTable.h中,您可以发现当弱密钥被回收时,'条目不一定被清除' :
+ (id)weakToStrongObjectsMapTable NS_AVAILABLE(10_8, 6_0);
// entries are not necessarily purged right away when the weak key is reclaimed
+ (id)weakToWeakObjectsMapTable NS_AVAILABLE(10_8, 6_0);
// entries are not necessarily purged right away when the weak key or object is reclaimed
答案 3 :(得分:-5)
NSMapTable与NSMutableDictionary的主要区别在于NSMapTable存储弱指针。这意味着当你像这样呼叫smth时:
[my_table setValue: val forKey: key];
不保留值和密钥(表示不向它们发送保留消息)。这就是为什么你可以使用任何对象(或者可能不是对象而是任何指针),因为它们不必响应保留消息。
所以你可能想要使用NSMapTable,如果你正在使用垃圾收集,你不需要为了保留一个对象的数量而烦恼。