objective-c - NSMapTable 和 NSMutableDictionary 的区别

标签 objective-c cocoa nsmutabledictionary

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/

相关文章:

objective-c - Mac OS X Lion 上的进程间通信

iphone - 如何开始编写 iPad 应用程序?

objective-c - 查看 NSMutableDictionary 的内容

ios - [NSMutableDictionary dictionaryWithObjectsAndKeys 会导致缓冲区溢出吗?

objective-c - Swift nil 与 Objective-C nil 不同

ios - 如何通过 objective-c (对于对话页面)增加表格 View 中的标签或 TextView 大小(高度和宽度)你能帮帮我吗?

objective-c - 更改Cocoa中的collectionview按钮的图像

objective-c - 带圆角的无边框 NSWindow

objective-c - NSMutableDictionary setObject : forKey - crashes 问题

objective-c - 使用 "semi-fixed"宽高比调整 NSWindow 的大小