是否有可能通过创建一个名称类的实例? 就像是:
NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
我不知道这是否可能在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];
如果你输入了错误的类名,或者如果它不存在,你会在编译时得到一个错误。 此外,我想这是更清晰的代码。
如果您正在使用的Objective-C,无工作NeXTstep
( OS X
, iOS
, GNUstep
等)的系统,或者你只是觉得这个方法更清洁,那么你可以利用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 + 1
为NeXTSTEP
API。
@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];