关于反射:按名称创建Objective-C类实例?

Create objective-c class instance by name?

是否可以按名称创建类的实例?类似:

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

我不知道这在客观C中是否可行,但似乎是,


1
id object = [[NSClassFromString(@"NameofClass") alloc] init];


NSClassFromString()挤兑风险的错误或不使用的类.类是不是存在。你会不会发现,直到运行时,如果你让这一错误。相反的,如果你使用内置类型的Class到Objective-C的编译器创建一个变量,然后将验证是类存在。

例如,在你的.h

1
@property Class NameOfClass;

然后在你的.m

1
id object = [[NameOfClass alloc] init];

如果你的类的名字mistyped或如果它是不是你的存在,让一个错误在编译的时间。我认为这也是清洁的代码。


如果你正在使用Objective - C的(没有NeXTstepOS XiOS等,GNUstep)系统或你只是认为这个方法是清洁,你可以使用运行时库的Objective - C语言的API。根据Objective-C 2.0

1
2
3
4
5
6
#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 ];

在Objective-C中(或unnamed 1.0版):你将使用以下

1
2
3
4
5
6
7
#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 ];

i避风港’t 1.0测试版的,但我有一个函数使用的是现在在2.0代码在生产。我个人认为,如果该函数是一2.0清洁利用可用的功能比它少的NS的异种类型的空间:the length of the name in bytes + 1 ( null terminator )the sum of two pointers (isa, cstring)2.0 API,size_t length (cstring_length)length of the string in bytes + 1NeXTstep的API。


1
2
3
4
5
6
7
8
9
10
11
12
@interface Magic : NSObject
+ (id)createInstanceOfClass:(Class)classe;
@end

@implementation Magic

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

@end

然后使用它:

1
2
Car *car = [Magic createInstanceOfClass:[Car class]];
[car engineTurnOn];