2011-01-11 8 views
29

文字列をクラス名に変換します。たとえば、文字列"MyExampleClass"のように、クラス名を含む文字列が変更されたとします。今、クラスMyExampleClassのオブジェクトを作成したいと思います。私は文字列からクラス名を取得する必要があります。私は次のようなことをしたい。 (コードをスケッチと同様に考えてください)文字列( "MyExampleClass")をクラス名(MyExampleClass)に変換します。

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

これは正しい方法はありますか?

+0

あなたはまだ反射に関するJavaチュートリアルを読んでいますか? – atk

+0

@atk:iOSの構文が異なりますか? – EmptyStack

+0

お詫び申し上げます。私はタグで "java"が見えたと思っていました。私は間違っていた:) – atk

答えて

76

は、あなたがしたいと思うものです:あなたはタイプ名(すなわちtheClass *myObject)としてtheClassを使用することはできません

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

注意。そのためにはidを使用する必要があります。

23

あなたはNSClassFromStringをしたい:

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

あなたはまたにObjCランタイム・インタフェース(例えばobjc_getClass(const char* name)objc_lookUpClass(const char* name))を使用することができます。前者はクラスをロードしません。後者は。そのオプションは場合によっては良いことになるかもしれません。ここで

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

これを使用すると、必要なものが得られます。

0

クラスを動的に構築しようとしている場合は、ファクトリメソッドのデザインパターンをよく見てみることをお勧めします。そうしないと、誰がどのようにビルドするかを追跡できなくなります。

これを行うには、文字列を受け取り、入力文字列に応じてクラスを返すクラスを作成できます。

「デザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素」を Erich Gammaによって見てください。リチャードヘルム;ラルフ・ジョンソン; John Vlissides。

関連する問題