3

我需要一个带有未复制键的字典。这让我跳起了欢乐的舞蹈,我最终走到了 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 上不存在的一些方法。

4

1 回答 1

3

如果您想了解使用免费桥接的问题,您应该从 Mike Ash 的“免费桥接内部原理”开始,然后从那里开始。

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

于 2011-09-27T19:05:51.490 回答