クラスのインスタンスを名前で作成することはできますか?ような何か:objective-cクラスインスタンスを名前で作成しますか?
NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
私は、これはObjective-Cで可能であるか知っているが、それは次のようになりますように思える、
クラスのインスタンスを名前で作成することはできますか?ような何か:objective-cクラスインスタンスを名前で作成しますか?
NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
私は、これはObjective-Cで可能であるか知っているが、それは次のようになりますように思える、
id object = [[NSClassFromString(@"NameofClass") alloc] init];
NSClassFromString()
は、クラス名をタイプミスか、そうでなければ使用してのリスクを実行しないでください存在しないクラス。そのエラーが発生した場合、実行時まで見つけることはできません。代わりに、組み込みのobjective-cタイプClass
を使用して変数を作成した場合、コンパイラはそのクラスが存在することを確認します。
.h
で例えば
、:
@property Class NameOfClass;
、その後のあなた.m
:あなたは、クラス名を入力ミスか、それが存在しない場合は、あなたが買ってあげる場合
id object = [[NameOfClass alloc] init];
コンパイル時のエラー。また、これはよりクリーンなコードだと思います。
あなたはそれを投票することができますか? –
そこに行く、バディ。それは2つの行を必要とし、より動的ではありませんが、すべての同じupvoted –
私は文字列の代わりにシンボルを使用したので、それは動的ではないと言うことができると思います。ただし、コードの作成時に必要なクラスが分かっている場合は、誤植を避けるためにシンボルを使用することをお勧めします。 –
あなたはNeXTstep
(OS X
、iOS
、GNUstep
など)システムなしでのObjective-Cで作業しているか、あなただけのこのメソッドはきれいだと思う場合は、Objective-C language runtime library's APIを利用することができます。 Objective-C 2.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
です。
@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];
これは、任意のリークが発生することはありませんか? – AntiMoron