Почему NSDictionary сообщает необычное имя класса? - PullRequest
5 голосов
/ 08 декабря 2010
NSDictionary *dict = [NSDictionary dictionary];
NSLog(@"%@", NSStringFromClass([dict class])); 

Этот код печатает "__NSDictionary0".

Для моих собственных классов печатается фактическое имя класса.

Почему NSDictionary идентифицирован как __NSDictionary0, и безопасно ли зависеть от этого?

Ответы [ 5 ]

20 голосов
/ 09 декабря 2010

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

15 голосов
/ 08 декабря 2010

NSDictionary является кластером классов.Прочитайте о них здесь:

Руководство по основам какао

Поскольку сам "настоящий" класс является частным, нет, он не безопасенна это.

Если вам нужно знать, действительно ли ваш класс является NSDictionary или нет, используйте [dict isKindOfClass:[NSDictionary class]];

1 голос
/ 09 декабря 2010

Итак, в основном вам нужно заранее знать, есть ли у вас NSMutableDictionary или пустой NSDictionary.Или не нужно знать.Или создать NSMutableDictionary из вашего объекта (NSDictionary или NSMutableDictionary)?

Для чего изначально был задан вопрос?

0 голосов
/ 09 июля 2012

Для теста изменчивости NSDictionary не могли бы вы просто использовать 'responsedsToSelector' для метода, который должен иметь только NSMutableDictionary, например addObject: ForKey:?

0 голосов
/ 09 декабря 2010

Если вы хотите проверить на изменчивость, лучше всего подойдет conformsToProtocol: @protocol (NSMutableCopying)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...