【问题标题】:Why does NSDictionary report an unusual class name?为什么 NSDictionary 报告一个不寻常的类名?
【发布时间】:2010-12-08 18:32:48
【问题描述】:
NSDictionary *dict = [NSDictionary dictionary];
NSLog(@"%@", NSStringFromClass([dict class])); 

此代码打印“__NSDictionary0”。

对于我自己的类,它会打印实际的类名。

为什么 NSDictionary 被标识为 __NSDictionary0,依赖它是否安全?

【问题讨论】:

    标签: objective-c reflection


    【解决方案1】:

    NSDictionary 是一个类簇,正如 Gendolkari 和 Class Clusters are documented 所说。

    而且,不,您不能依赖私有子类的确切身份。

    您当然应该能够执行以下操作来确定它是否是字典:

    [myThingaMaHoover isKindOfClass: [NSDictionary class]];
    

    或者,至少,它是作为NSDictinoary 类集群的一部分实现的字典。

    您不能做的是使用isKindOfClass:isMemberOfClass: 来确定字典(或字符串、数组或集合)是否可变。考虑:

    NSDictionary *d = [NSDictionary dictionaryWithObject: [[NSObject new] autorelease] forKey: @"Bob"];
    NSMutableDictionary *m = [NSMutableDictionary dictionaryWithObject: [[NSObject new] autorelease] forKey: @"Bob"];
    NSLog(@"d class: %@ %@ %@", [d class], [d superclass], [[d superclass] superclass]);
    NSLog(@"m class: %@ %@ %@", [m class], [m superclass], [[m superclass] superclass]);
    

    这个输出:

    d class: NSCFDictionary NSMutableDictionary NSDictionary
    m class: NSCFDictionary NSMutableDictionary NSDictionary
    

    dm 都是 NSCFDictionary 的实例,它继承自 NSMutableDictionary(继承自 NSDictionary)。

    【讨论】:

      【解决方案2】:

      NSDictionary 是一个类簇。在这里阅读它们:

      Cocoa Fundamentals Guide

      由于“实际”类本身是私有的,不,依赖它是安全的。

      如果你想知道你的类是否真的是 NSDictionary,请使用[dict isKindOfClass:[NSDictionary class]];

      【讨论】:

      • 好答案。如果下一个问题是“我正在尝试确定字典是否可变”,那么......不......你也不能这样做。
      • 你不能使用isMemberOfClass:[NSMutableDictionary class]吗?
      • 是的,isMemberOfClass:可用于确定字典是否可变。
      • 通过编辑,这个答案现在是错误的。您可以使用-isMemberOfClass: 检查可变性的建议也是如此。你不能。
      • Gendolkari:是的,你可以测试一个对象是否是一种NSDictionary来测试它是否是一个字典。不要测试它是一种 NSMutableDictionary 还是任何私有子类。
      【解决方案3】:

      所以,基本上,您需要事先知道您是否拥有 NSMutableDictionary 或裸 NSDictionary。或者不需要知道。或者从您的对象(NSDictionary 或 NSMutableDictionary)创建 NSMutableDictionary?

      这个问题最初是为了什么?

      【讨论】:

        【解决方案4】:

        如果你想测试可变性,你最好的选择可能是conformsToProtocol:@protocol(NSMutableCopying)

        【讨论】:

        • NSDictionary 和 NSArray 向 NSMutableCopying 确认。
        【解决方案5】:

        对于 NSDictionary 可变性测试,您不能只为只有 NSMutableDictionary 才有的方法使用“respondsToSelector”,例如 addObject:ForKey:?

        【讨论】:

          猜你喜欢
          • 2021-11-17
          • 1970-01-01
          • 1970-01-01
          • 2011-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多