【问题标题】:NSMutableDictionary vs CFMutableDictionaryNSMutableDictionary 与 CFMutableDictionary
【发布时间】:2011-09-27 18:57:32
【问题描述】:

我需要具有未复制键的字典。这让我跳起了欢乐的舞会,我最终走到了 CFMutableDictionary 的门口。

我试图了解它们在多大程度上可以互换。在 Apple 的 CFMutableDictionary 文档中,他们声明:

在你看到 NSMutableDictionary * 参数的方法中,你可以 传入 CFMutableDictionaryRef,并在您看到 CFMutableDictionaryRef 参数,可以传入一个 NSMutableDictionary 实例。

但我想知道是否可以将 CFMutableDictionary 转换为 NSMutableDictionary 并在其上调用 NSMutableDictionary 的方法,在某些情况下似乎可以;

如果我使用 CFDictionaryCreateMutable() 创建 CFMutableDictionary 并将其转换为 NSMutableDictionary。

我可以打电话:

[cfDictionaryCastToNSDictionary objectForKey:someKey]

我也可以打电话:

[cfDictionaryCastToNSDictionary setObject:someObject forKey:someKey]

... 如果没有实现 NSCopying,它将复制密钥或引发异常。我还可以使用 for in 循环遍历其值。

但是,如果我打电话:

[cfDictionaryCastToNSDictionary count]

我遇到了异常。

我的问题是引擎盖下到底发生了什么? Apple 文档从来没有提到能够通过强制转换为 NSDictionary 来调用 CFMutableDictionary 上不存在的一些方法。

【问题讨论】:

  • 如果您的目标是桌面 Cocoa,请查看 NSPointerArray
  • 你得到了哪个异常?调用 count 应该可以正常工作。
  • 不幸的是,我的目标是移动设备。我很震惊没有像 NSPointerArray 这样可用的东西。

标签: objective-c nsmutabledictionary cfmutabledictionary


【解决方案1】:

如果您想了解使用免费桥接的问题,您应该从 Mike Ash 的"Toll-Free Bridging Internals" 开始,然后从那里开始。

如果您只是想重新开始工作,答案是,不要那样做;通过将 CF 函数与 CFDictionary 一起使用而不是免费桥接来完全避免该问题。如果字典纯粹在内部使用,CFDictionary API 应该足以做任何你想做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多