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

Ten kod wyświetla "__NSDictionary0".Dlaczego NSDictionary zgłasza nietypową nazwę klasy?

Dla moich własnych klas wypisuje aktualną nazwę klasy.

Dlaczego NSDictionary jest identyfikowany jako __NSDictionary0 i czy można na nim polegać?

Odpowiedz

15

NSDictionary to klaster klasy. Przeczytaj o nich tutaj:

Cocoa Fundamentals Guide

jako „rzeczywiste” klasa sama w sobie jest prywatny, nie, to nie jest bezpieczne polegać.

Jeśli chcesz wiedzieć, czy twoja klasa jest naprawdę NSDictionary lub nie, użyj [dict isKindOfClass:[NSDictionary class]];

+4

Dobra odpowiedź. A jeśli następne pytanie brzmi "Próbuję ustalić, czy słownik jest zmienny czy nie", to ... nie ... nie możesz tego zrobić. – bbum

+3

Nie można użyć do tego opcji "isMemberOfClass: [NSMutableDictionary class]"? – GendoIkari

+0

Tak, isMemberOfClass: można użyć do określenia, czy słownik jest zmienny czy nie. – JustSid

20

NSDictionary jest klaster klasy, jak Gendolkari powiedział i Class Clusters are documented.

I, nie, nie można polegać na dokładnej tożsamości prywatnej podklasy.

należy z pewnością będzie w stanie wykonać następujące czynności, aby ustalić, czy jest to słownik czy nie:

[myThingaMaHoover isKindOfClass: [NSDictionary class]]; 

lub, co najmniej, że jest to słownik jak realizowany jako część klasy NSDictinoary grupa.

Nie można użyć funkcji isKindOfClass: lub isMemberOfClass: w celu określenia, czy słownik (lub ciąg, tablica lub zestaw) może być modyfikowany. Rozważyć:

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]); 

wyjścia to, że:

d class: NSCFDictionary NSMutableDictionary NSDictionary 
m class: NSCFDictionary NSMutableDictionary NSDictionary 

d i m są zarówno przypadki NSCFDictionary która dziedziczy NSMutableDictionary (która dziedziczy NSDictionary).

+0

+1 dla przykładu. – GendoIkari

1

Przede wszystkim musisz wiedzieć, czy masz wcześniej NSMutableDictionary lub goły NSDictionary. Lub nie musisz wiedzieć. Lub utworzyć NSMutableDictionary z obiektu (NSDictionary lub NSMutableDictionary)?

Jakie było pierwotnie pytanie?

0

Jeśli chcesz przetestować zmienności, najlepiej byłoby prawdopodobnie conformsToProtocol: @protocol (NSMutableCopying)

+1

NSDictionary i NSArray potwierdzają NSMutableCopying. – Karmeye

0

Dla NSDictionary testu zmienności, could't po prostu do „respondsToSelector” dla sposobu, który tylko NSMutableDictionary miałby, podobnie jak addObject: ForKey :?

Powiązane problemy