按名称创buildObjective-C类实例?
有没有可能通过名称创build一个类的实例? 就像是:
NSString* className = @"Car"; id* p = [Magic createClassByName:className]; [p turnOnEngine];
我不知道在Objective-C中这是否可行,但似乎是这样,
id object = [[NSClassFromString(@"NameofClass") alloc] init];
NSClassFromString()
冒着错误的类名或者使用不存在的类的风险。 如果你犯了这个错误,你将不会在运行之前find它。 相反,如果使用Class
的内build的objective-ctypes来创build一个variables,那么编译器将会validation这个类是否存在。
例如,在你的.h
:
@property Class NameOfClass;
然后在你的.m
:
id object = [[NameOfClass alloc] init];
如果错误地input了类名或者它不存在,那么编译时就会出错。 另外我认为这是更清晰的代码。
如果你正在使用没有NeXTstep
( OS X
, iOS
, GNUstep
等)系统的Objective-C ,或者你只是觉得这个方法更清晰,那么你可以利用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 ];
我没有testing1.0
版本,但是我已经在生产中使用2.0
代码。 我个人认为,使用2.0
函数比NS函数更清洁,因为它占用更less的空间:2.0 API the length of the name in bytes + 1 ( null terminator )
与the sum of two pointers (isa, cstring)
,一个size_t length (cstring_length)
,以及NeXTSTEP
API的length of the string in bytes + 1
size_t length (cstring_length)
length of the string in bytes + 1
为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];