Czy można utworzyć instancję klasy według nazwy? Coś jak:
NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
Nie wiem, czy jest to możliwe w celu-c, ale wygląda na to, że tak byłoby,
objective-c
reflection
znak
źródło
źródło
NSClassFromString()
stwarza ryzyko błędnego wpisania nazwy klasy lub użycia klasy, która nie istnieje. Nie dowiesz się do czasu uruchomienia, jeśli popełnisz ten błąd. Zamiast tego, jeśli użyjesz wbudowanego typu celu-cClass
do utworzenia zmiennej, kompilator sprawdzi, czy klasa istnieje.Na przykład w
.h
:a następnie w
.m
:Jeśli błędnie wpisałeś nazwę klasy lub jeśli nie istnieje, pojawi się błąd w czasie kompilacji. Myślę też, że to bardziej przejrzysty kod.
źródło
Jeśli pracujesz z Objective-C bez
NeXTstep
(OS X
,iOS
,GNUstep
etc) systemu lub po prostu, że ta metoda jest czystsze, a następnie można wykorzystać API Objective-C Language Runtime biblioteki . PodObjective-C 2.0
:W ramach Objective-C (1.0 lub wersja nienazwana) użyjesz:
Nie testowałem
1.0
wersji, ale użyłem2.0
funkcji w kodzie, który jest teraz w produkcji. Osobiście uważam, że korzystanie z2.0
funkcji jest czystsze, jeśli jest dostępna, niż funkcja NS, ponieważ zajmuje mniej miejsca:the length of the name in bytes + 1 ( null terminator )
dla API 2.0 w porównaniu zthe sum of two pointers (isa, cstring)
asize_t length (cstring_length)
ilength of the string in bytes + 1
dlaNeXTSTEP
API.źródło
Następnie, aby go użyć:
źródło