2010-12-08 3 views
5
NSDictionary *dict = [NSDictionary dictionary]; 
NSLog(@"%@", NSStringFromClass([dict class])); 

Этот код напечатал "__NSDictionary0".Почему NSDictionary сообщает о необычном имени класса?

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

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

ответ

15

NSDictionary - кластер классов. Читайте о них здесь:

Cocoa Fundamentals Guide

В качестве «реальной» класс сам по себе является частным, нет, это не безопасно зависеть от этого.

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

+4

Хороший ответ. И если следующий вопрос: «Я пытаюсь определить, является ли словарь изменчивым или нет», тогда ... нет ... вы тоже не можете этого сделать. – bbum

+3

Не могли бы вы использовать 'isMemberOfClass: [NSMutableDictionary class]' для этого? – GendoIkari

+0

Yep, isMemberOfClass: может использоваться, чтобы определить, является ли словарь изменчивым или нет. – JustSid

20

NSDictionary класс кластер, как сказал Gendolkari и Class Clusters are documented.

И, нет, вы не можете зависеть от точного идентификатора частного подкласса.

Вы, конечно, должны быть в состоянии выполнить следующие действия, чтобы определить, если это словарь или нет:

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

+0

+1 для примера. – GendoIkari

1

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

Зачем у меня был вопрос?

0

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

+1

NSDictionary и NSArray подтверждает NSMutableCopying. – Karmeye

0

Для теста NSDictionary Изменчивости, could't вам просто к «respondsToSelector» для метода, который только в NSMutableDictionary будет, например, addObject: ForKey :?

Смежные вопросы