NSMapTable和NSMutableDictionary的区别

时间:2011-08-01 21:13:00

标签: objective-c cocoa nsmutabledictionary

NSMapTable是否与NSMutableDictionary相同,只是允许键是指针?

内存管理是否有所不同?

4 个答案:

答案 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,如果你正在使用垃圾收集,你不需要为了保留一个对象的数量而烦恼。