我需要一个包含未复制键的字典。这引起了我的欢乐舞蹈,我最终走进了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上不存在的某些方法。
答案 0 :(得分:3)
如果您希望了解使用免费桥接的问题,您应该从Mike Ash的"Toll-Free Bridging Internals"开始,然后从那里开始。
如果你只想回去工作,答案是,不要那样做;通过使用CFDictionary的CF函数而不是免费桥接来完全避免这个问题。如果字典纯粹是在内部使用的话,CFDictionary API应该足以完成你想要做的任何事情。