views:

1320

answers:

3

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.

+4  A: 

You want to use NSClassFromString, like this:

Class klass = NSClassFromString(@"MyClass");
id obj = [[klass alloc] init];
Louis Gerbarg
it's "Class" instead of "Class *"
newacct
I should never write code in a webform while I am tired ;-) Thanks, fixed.
Louis Gerbarg
+2  A: 

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.

Quinn Taylor
A: 

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.

zaccox