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

Objective c 为什么NSDictionary报告一个不寻常的类名?,objective-c,reflection,Objective C,Reflection,此代码打印“\uu NSDictionary0” 对于我自己的类,它打印实际的类名 为什么NSDictionary被标识为u NSDictionary0,并且依赖于此安全吗?NSDictionary是一个类集群。请在此处阅读有关它们的信息: 因为“实际”类本身是私有的,不,依赖它是不安全的 如果您需要知道您的类是否真的是NSDictionary,请使用[dict iskindof类:[NSDictionary类]正如Gendolkari所说,NSDictionary是一个类集群 不,你不能依赖

此代码打印“\uu NSDictionary0”

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


为什么NSDictionary被标识为u NSDictionary0,并且依赖于此安全吗?

NSDictionary是一个类集群。请在此处阅读有关它们的信息:

因为“实际”类本身是私有的,不,依赖它是不安全的


如果您需要知道您的类是否真的是NSDictionary,请使用
[dict iskindof类:[NSDictionary类]

正如Gendolkari所说,NSDictionary
是一个类集群

不,你不能依赖于私有子类的确切身份

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

NSDictionary *dict = [NSDictionary dictionary];
NSLog(@"%@", NSStringFromClass([dict class])); 
或者,至少,它是作为
nsdictionary
类集群的一部分实现的字典

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

[myThingaMaHoover isKindOfClass: [NSDictionary class]];
这将产生:

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
m
都是继承自
NSMutableDictionary
(继承自
NSDictionary
)的
NSCFDictionary
的实例。

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


最初的问题是什么?

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

对于NSDictionary易变性测试,你能不能只对一个只有NSMutableDictionary才会有的方法进行“respondsToSelector”,比如addObject:ForKey:?

回答得好。如果下一个问题是“我正在尝试确定字典是否是可变的”,那么。。。不您也不能这样做。您是否可以使用
isMemberOfClass:[NSMutableDictionary class]
来进行此操作?是的,isMemberOfClass:可用于确定字典是否可更改。通过编辑,此答案现在是错误的。下面是一些建议,您可以使用
-isMemberOfClass:
检查可变性。Gendolkari:是的,你可以测试一个对象是否是一种字典来测试它是否是一种字典。不要测试它是一种NSMutableDictionary还是任何私有子类。NSDictionary和NSArray确认NSMutableCopy。
d class: NSCFDictionary NSMutableDictionary NSDictionary
m class: NSCFDictionary NSMutableDictionary NSDictionary