为什么NSDictionary报告一个不寻常的类名?

时间:2010-12-08 18:32:49

标签: objective-c reflection

NSDictionary *dict = [NSDictionary dictionary];
NSLog(@"%@", NSStringFromClass([dict class])); 

此代码打印“__NSDictionary0”。

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

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

5 个答案:

答案 0 :(得分:20)

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)。

答案 1 :(得分:15)

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

Cocoa Fundamentals Guide

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

如果您需要知道您的课程是否真的是NSDictionary,请使用[dict isKindOfClass:[NSDictionary class]];

答案 2 :(得分:1)

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

最初的问题是什么?

答案 3 :(得分:0)

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

答案 4 :(得分:0)

对于NSDictionary可变性测试,你不能只为一个只有NSMutableDictionary的方法的'respondsToSelector',比如addObject:ForKey:?