按名称创建Objective-C类的实例?(Create objective-c class ins

2019-06-17 14:02发布

是否有可能通过创建一个名称类的实例? 就像是:

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

我不知道这是否可能在Objective-C,但看起来这将是,

Answer 1:

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


Answer 2:

NSClassFromString()运行错误输入的类名或使用不存在的一类风险。 你不会发现,直到运行时,如果你作出这样的错误。 相反,如果你使用的内置的Objective-C型Class来创建一个变量,那么编译器将验证类存在。

例如,在您.h

@property Class NameOfClass;

然后在您.m

id object = [[NameOfClass alloc] init];

如果你输入了错误的类名,或者如果它不存在,你会在编译时得到一个错误。 此外,我想这是更清晰的代码。



Answer 3:

如果您正在使用的Objective-C,无工作NeXTstepOS XiOSGNUstep等)的系统,或者你只是觉得这个方法更清洁,那么你可以利用Objective-C语言运行时库的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 ];

在Objective-C的(1.0或无名的版本),你会使用下列内容:

#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在码功能,现在是在生产。 个人认为利用2.0函数比NS功能吸尘器如果可用,因为它消耗更少的空间: the length of the name in bytes + 1 ( null terminator )为2.0 API与the sum of two pointers (isa, cstring)一个size_t length (cstring_length)并且length of the string in bytes + 1NeXTSTEP API。



Answer 4:

@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];


文章来源: Create objective-c class instance by name?