Próbuję uzyskać nazwę ciągu klasy z samego obiektu klasy.
// For instance
[NSArray className]; // @"NSArray"
Znalazłem, object_getClassName(id obj)
ale wymaga to przekazania do niego instancji, aw moim przypadku jest to niepotrzebna praca.
Jak więc mogę uzyskać ciąg znaków z obiektu klasy, a nie instancji?
NSStringFromClass
wdrażany? Czy bardziej wydajne jest przechowywanie nazwy klasy wstatic NSString
zmiennej?[NSArray class]
) Jest w rzeczywistości plikiemstruct
.struct
Zawiera wiele informacji o klasie, w tym jego nazwy, metody implementuje, superklasę itdNSStringFromClass
prostu ciągnie nazwę klasy z tegostruct
i konwertuje go naNSString
. Nie przechowuj nazwy klasy w astatic NSString
, nie zapewni to żadnej korzyści w zakresie wydajności.NSClassFromString
działa trochę inaczej. Ponieważ wszystkie nazwy klas istnieją gdzieś w środowisku wykonawczym Objective-C,NSClassFromString
pobiera ciąg i przegląda listę klas obsługiwanych przez środowisko wykonawcze w poszukiwaniu klasy o podanej nazwie. Jeśli go znajdzie, zwraca go, w przeciwnym razie zwracaNil
.class_getName()
w czasie wykonywania, co zwraca ciąg CclassName
to metoda dodana przez rozszerzenia skryptów, która jest dostępna tylko w systemie Mac OS X, nawet wtedy jest skomplikowana w działaniu, ponieważ nie jest w pełni udokumentowana (a przynajmniej nie była to ostatnia, gdy sprawdzałem).NSStringFromClass()
jest właściwym sposobem rozwiązania tego problemu.Oto inny sposób na zrobienie tego przy nieco mniejszym pisaniu:
NSString *name = [NSArray description];
źródło
+description
, jednak teoretycznie nie jest to celem+description
, więc ta metoda jest delikatna do określania nazw klas.Rozważ tę alternatywę:
const char *name = class_getName(cls);
Jest znacznie szybszy, ponieważ nie musi przydzielać obiektu NSString i konwertować ASCII na jakąkolwiek
NSString
reprezentację. TakNSStringFromClass()
jest wdrażane.źródło