什么是NSCFDictionary?

JPC*_*JPC 10 cocoa objective-c nsdictionary core-foundation

我得到一个NSCFDictionary返回给我,我无法弄清楚如何使用它.我知道它的类型是NSCFDictionary,因为我打印了类,它出现了__NCSFDictionary.我无法弄清楚如何用它做任何事情.

我现在只想抓住它,但甚至无法让它工作:

  NSDictionary *dict = [[NSURLCredentialStorage sharedCredentialStorage] allCredentials];
  for(NSURLProtectionSpace key in [dict keyEnumerator])
  {
         NSCFDictionary *value = [dict objectForKey:key];
  }
Run Code Online (Sandbox Code Playgroud)

allCredentials的类引用说它应该返回一个字典,其值也是字典.我的任务说明不起作用.我需要某种演员吗?

jtb*_*des 25

NSDictionary和其他集合类实际上是类集群:在单个类的接口下伪装的几个具体子类:它们都提供相同的功能(因为它们是同一个类的子类 - 在NSDictionary的情况下,这涉及三个"原语"方法" -count ,, -objectForKey:和" -keyEnumerator,但根据它们的创建方式和可能存储的数据类型,在不同情况下具有不同的内部工作方式.

NSCFDictionary只是NSDictionary的具体子类.也就是说,您的NSDictionaries实际上可能是NSCFDictionary实例,但您应该将它们视为NSDictionary的实例,因为这将为您提供所需的字典存储功能.

NSDictionary *value = [dict objectForKey:key];

现在,你的代码不起作用的另一个原因:NSURLProtectionSpace是一个类,所以你应该将它用作指针,如下所示:

for (NSURLProtectionSpace *key ...
Run Code Online (Sandbox Code Playgroud)

  • @JPC:与此问题有关的一个重要区别是,在运行时*(在这种情况下,NSCFDictionary而不是NSDictionary直接)返回给您的对象类型不会在编译时*导致问题*.编译在执行之前发生; 如果编译器在构建程序时向您显示错误,那么如果您可以运行它就不会发生任何事情. (2认同)