2011-01-11 10 views
29

Chcę przekonwertować ciąg znaków na nazwę klasy. Wyobraź sobie, że mam ciąg znaków, który się zmienia, zawierający nazwę klasy, na przykład ciąg "MyExampleClass". Teraz chcę utworzyć obiekt klasy MyExampleClass. Muszę pobrać nazwę klasy z ciągu znaków. Chcę zrobić coś takiego. (Rozważmy kod tak jak szkic.)Konwertuj ciąg znaków ("MyExampleClass") na nazwę klasy (MyExampleClass)

NSString *classNameStr = "MyExampleClass"; 
id theClass = [UIClass classFromString:classNameStr]; 
theClass *myObject = [[theClass alloc] init]; 

Jaki jest właściwy sposób to zrobić?

+0

Czy znasz już samouczek języka Java o refleksji? – atk

+0

@atk: Czy system iOS nie ma innej składni? – EmptyStack

+0

Przeprosiny. Myślałem, że widziałem "java" w tagach. Myliłem się :) – atk

Odpowiedz

76

Oto co tylko chcesz:

Class theClass = NSClassFromString(classNameStr); 
id myObject = [[theClass alloc] init]; 

Należy pamiętać, że nie można używać theClass jako nazwy typu (tzn theClass *myObject). Będziesz musiał użyć do tego celu id.

23

Chcesz NSClassFromString:

NSString *classNameStr = @"MyExampleClass"; 
Class theClass = NSClassFromString(classNameStr); 
id myObject = [[theClass alloc] init]; 

Można również użyć objc interfejsy uruchomieniowe (np objc_getClass(const char* name), objc_lookUpClass(const char* name)). Ten pierwszy nie załaduje klasy. Ten drugi będzie. Ta opcja może być w niektórych przypadkach dobra.

6
id a = [[NSClassFromString(@"MyExampleClass") alloc] init]; 

użyj tego, co da ci to, czego chcesz.

0

Jeśli próbujesz budować swoje klasy dynamicznie, polecam lepiej przyjrzeć się wzorowi projektowemu fabryki, w przeciwnym razie stracisz kontrolę nad tym, kto buduje co i jak.

W tym celu można zakodować klasę, która odbiera ciąg znaków i zwraca klasę w zależności od wprowadzanego ciągu znaków.

Spójrz na książkę "Wzorce projektowe: elementy oprogramowania wielokrotnego użytku" autorstwa: Erich Gamma; Richard Helm; Ralph Johnson; John Vlissides.