2009-07-23 10 views
90

クラスのインスタンスを名前で作成することはできますか?ような何か:objective-cクラスインスタンスを名前で作成しますか?

NSString* className = @"Car"; 
id* p = [Magic createClassByName:className]; 
[p turnOnEngine]; 

私は、これはObjective-Cで可能であるか知っているが、それは次のようになりますように思える、

答えて

210
id object = [[NSClassFromString(@"NameofClass") alloc] init]; 
+0

これは、任意のリークが発生することはありませんか? – AntiMoron

38

NSClassFromString()は、クラス名をタイプミスか、そうでなければ使用してのリスクを実行しないでください存在しないクラス。そのエラーが発生した場合、実行時まで見つけることはできません。代わりに、組み込みのobjective-cタイプClassを使用して変数を作成した場合、コンパイラはそのクラスが存在することを確認します。

あなた .hで例えば

、:

@property Class NameOfClass; 

、その後のあなた.m:あなたは、クラス名を入力ミスか、それが存在しない場合は、あなたが買ってあげる場合

id object = [[NameOfClass alloc] init]; 

コンパイル時のエラー。また、これはよりクリーンなコードだと思います。

+1

あなたはそれを投票することができますか? –

+0

そこに行く、バディ。それは2つの行を必要とし、より動的ではありませんが、すべての同じupvoted –

+0

私は文字列の代わりにシンボルを使用したので、それは動的ではないと言うことができると思います。ただし、コードの作成時に必要なクラスが分かっている場合は、誤植を避けるためにシンボルを使用することをお勧めします。 –

8

あなたはNeXTstepOS XiOSGNUstepなど)システムなしでのObjective-Cで作業しているか、あなただけのこのメソッドはきれいだと思う場合は、Objective-C language runtime library's APIを利用することができます。 Objective-C 2.0の下:

のObjective-C(1.0または無名のバージョン)を使用すると、以下のように利用することになるの下
#import <objc/runtime.h> 
//Declaration in the above named file 
id objc_getClass(const char* name); 
//Usage 
id c = objc_getClass("Object"); 
[ [ c alloc ] free ]; 

#import <objc/objc-api.h> 
//Declaration within the above named file 
Class objc_get_class(const char* name); 
//Usage 
Class cls = objc_get_class("Test"); 
id obj = class_create_instance(cls); 
[ obj free ]; 

私は1.0バージョンをテストしていない、しかし私は2.0機能を使用していました現在生産中のコードで実行されます。私は個人的には、より少ないスペースを消費するので、NS関数よりも利用可能な場合には2.0関数を利用することがよりクリーナーであると信じています。NeXTSTEP APIの場合、the sum of two pointers (isa, cstring)、、およびlength of the string in bytes + 1です。

2
@interface Magic : NSObject 
+ (id)createInstanceOfClass:(Class)classe; 
@end 

@implementation Magic 

+ (id)createInstanceOfClass:(Class)classe 
{ 
    return [[classe alloc] init]; 
} 

@end 

そして、それを使用します

Car *car = [Magic createInstanceOfClass:[Car class]]; 
[car engineTurnOn]; 
関連する問題