【问题标题】:What is an NSCFDictionary?什么是 NSCF 词典?
【发布时间】:2011-08-23 05:56:12
【问题描述】:

我收到了一个返回给我的 NSCFDictionary,但我不知道如何使用它。我知道它是 NSCFDictionary 类型的,因为我打印了这个类,它以 __NCSFDictionary 的形式出现。我不知道如何处理它。

我现在只是想坚持下去,但什至无法让它发挥作用:

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

allCredentials 的类引用说它应该返回一个字典,其值也是字典。我的赋值语句不起作用。我需要某种演员表吗?

【问题讨论】:

    标签: objective-c cocoa nsdictionary core-foundation


    【解决方案1】:

    NSDictionary 和其他collection classes 实际上是class clusters:几个具体子类 类伪装在单个类的接口下:它们都提供相同的功能(因为它们是相同的子类类——在 NSDictionary 的例子中,这涉及到三个 “原始方法” -count-objectForKey:-keyEnumerator),但是在不同的情况下具有不同的内部工作方式以提高效率,具体取决于如何它们被创建以及它们可能存储的数据类型。

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

    NSDictionary *value = [dict objectForKey:key];

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

    for (NSURLProtectionSpace *key ...
    

    【讨论】:

    • 我尝试使用 NSDictionary 但它无法编译。可能是 Xcode 问题
    • @JPC:与此问题相关的一个重要区别是在运行时返回给您的对象类型(在这种情况下,直接使用 NSCFDictionary 而不是 NSDictionary ) 不会导致编译时出现问题。编译发生在执行之前;如果编译器在构建程序时向您显示错误,那么如果您可以运行它就不会发生任何事情。
    • 我有一个类似的问题,我想检查对象的类是否是某种类型(NSString、NSNumber、NSData、NSDictionary 或 NSArray)。对象的类返回 NSCFString、NSCFDictionary 等,这意味着我的检查失败。有没有办法解决这个问题?
    • @MagicBulletDave 为此使用isKindOfClass:stackoverflow.com/a/6840896/23649(例如,NSString 对象在运行时可能类似于 NSCFString,它始终是 NSString 本身的子类)。
    • 实际上这里缺少的部分是 NSDictionary 是免费桥接到 CFDictionary 的,并且在大多数情况下两者都会创建一个 NSCFDictionary 的实例。
    【解决方案2】:

    NSCFDictionary 是实现实际功能的 NSDictionary 的私有子类。它只是一个 NSDictionary。几乎任何你使用的 NSDictionary 都将是一个 NSCFDictionary。你的代码没关系。您可以将变量键入为 NSDictionary 并相应地使用它。

    【讨论】:

    • hmm 那这怎么行不通...NSDictionary *value = [dict objectForKey:key];
    • @JPC:假设dict 持有一个指向响应objectForKey: 的对象的指针,例如NSDictionary(或其任何子类)的另一个实例,它工作得很好。
    【解决方案3】:

    我有一个 NSCFDictionary 实际上是一个 NSMutableDictionary 对象,我可以从中删除项目。我提到这一点是为了进一步澄清 jtbandes 的回答:NSCFDictionary 对象可以是任何继承自 NSDictionary 的对象。

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2019-02-07
      相关资源
      最近更新 更多