NSDictionary
- это кластер классов, как сказал Гендолкари, и Кластеры классов документированы .
И, нет, вы не можете зависеть от точной идентичности частного подкласса.
Вы определенно должны быть в состоянии сделать следующее, чтобы определить, является ли это словарь или нет:
[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
d
и m
- оба экземпляра NSCFDictionary
, который наследуется от NSMutableDictionary
(который наследуется от NSDictionary
).