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

ste*_*vex 5 reflection objective-c

NSDictionary *dict = [NSDictionary dictionary];
NSLog(@"%@", NSStringFromClass([dict class])); 
Run Code Online (Sandbox Code Playgroud)

此代码打印"__NSDictionary0".

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

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

bbu*_*bum 20

NSDictionary是一个类集群,正如Gendolkari所说,并且类集群已被记录.

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

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

[myThingaMaHoover isKindOfClass: [NSDictionary class]];
Run Code Online (Sandbox Code Playgroud)

或者,至少,它是作为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]);
Run Code Online (Sandbox Code Playgroud)

这输出:

d class: NSCFDictionary NSMutableDictionary NSDictionary
m class: NSCFDictionary NSMutableDictionary NSDictionary
Run Code Online (Sandbox Code Playgroud)

d并且m都是NSCFDictionary继承自NSMutableDictionary(继承自NSDictionary)的实例.


Gen*_*ari 15

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

可可基础指南

作为"实际"类本身是私有的,不,这是不是安全的,取决于此.

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

  • 好答案.如果下一个问题是"我正在试图确定字典是否可变",那么......不......你也不能这样做. (4认同)
  • 你能不能使用`isMemberOfClass:[NSMutableDictionary class]`吗? (3认同)
  • 通过编辑,这个答案现在是错误的.那么你可以使用`-isMemberOfClass:`来检查是否存在可变性.你不能. (2认同)