NSDictionary *dict = [NSDictionary dictionary];
NSLog(@"%@", NSStringFromClass([dict class]));
This code prints "__NSDictionary0".
For my own classes it prints the actual class name.
Why is NSDictionary identified as __NSDictionary0, and is it safe to depend on this?
NSDictionary
is a class cluster, as Gendolkari said and Class Clusters are documented.And, no, you can't depend on the exact identity of the private subclass.
You should certainly be able to do the following to determine if it is a dictionary or not:
Or, at the least, that it is a dictionary as implemented as a part of the
NSDictinoary
class cluster.What you can't do is use
isKindOfClass:
orisMemberOfClass:
to determine whether or not a dictionary (or string, array, or set) is mutable. Consider:This outputs:
d
andm
are both instances ofNSCFDictionary
which inherits fromNSMutableDictionary
(which inherits fromNSDictionary
).If you want to test for mutability, your best bet would probably be conformsToProtocol: @protocol(NSMutableCopying)
NSDictionary is a class cluster. Read about them here:
Cocoa Fundamentals Guide
As the "actual" class itself is private, no, it is not safe to depend on this.
If you need to know if your class is really an NSDictionary or not, use
[dict isKindOfClass:[NSDictionary class]];
For an NSDictionary mutability test, could't you just to a 'respondsToSelector' for a method that only an NSMutableDictionary would have, like addObject:ForKey:?
So, basically, you need to know if you are having an NSMutableDictionary or a bare NSDictionary beforehand. Or don't need to know. Or create an NSMutableDictionary from your object (NSDictionary or NSMutableDictionary)?
What was the question originally for?