收录日期:2020/12/04 06:17:15 时间:2009-07-04 23:24:19 标签:objective-c,static-constructor

I am trying to build something to dynamically instantiate an object from class-name similar to how Java's Class.forName method works, e.g.

Class klass = Class.forName("MyClass");
Object obj = klass.instantiate(...

I didn't see any such behavior in Objective-C so I would like to call a method to register Class when an Objective-C class is loaded. Basically, I would like to call a method that registers my class, e.g.

+ (void)mystatic {
  [NSKeyedUnarchiver setClass:[self class] forClassName:"MyClass"]
}

Is there a way to do this in Objective-C on OS X platform?

Thanks.

You want to use NSClassFromString, like this:

Class klass = NSClassFromString(@"MyClass");
id obj = [[klass alloc] init];

First, there is indeed such an equivalent in Objective-C — as @Louis suggested, use NSClassFromString().

Second, if you want a static constructor like in Java, you can do that as well with the +initialize method. See this related SO question.

You can also say

Class myClass = [[NSBundle mainBundle] classNamed: @"MyClassName];
id myInstance = [[myClass alloc] init];

This frequently helps with cases when the runtime may not have come across your class yet.