30

I want to convert a string to a class name. Imagine that I have a string, which changes, containing a class name, for example, the string "MyExampleClass". Now, I want to create an object of the class MyExampleClass. I have to get the class name from the string. I want to do something like the following. (Consider the code just as a sketch.)

NSString *classNameStr = "MyExampleClass";
id theClass = [UIClass classFromString:classNameStr];
theClass *myObject = [[theClass alloc] init];

What is the right way to do this?

jscs
  • 63,694
  • 13
  • 151
  • 195
EmptyStack
  • 51,274
  • 23
  • 147
  • 178

4 Answers4

76

Here's what you'd want:

Class theClass = NSClassFromString(classNameStr);
id myObject = [[theClass alloc] init];

Note that you can't use theClass as a type name (i.e. theClass *myObject). You'll have to use id for that.

Alex
  • 26,829
  • 3
  • 55
  • 74
22

You want NSClassFromString:

NSString *classNameStr = @"MyExampleClass";
Class theClass = NSClassFromString(classNameStr);
id myObject = [[theClass alloc] init];

You can also use the objc runtime interfaces (e.g. objc_getClass(const char* name), objc_lookUpClass(const char* name)). The former will not load a class. The latter will. That option could be a good thing in some cases.

justin
  • 104,054
  • 14
  • 179
  • 226
6
id a = [[NSClassFromString(@"MyExampleClass") alloc] init];

use this one this will give you what you want.

Ishu
  • 12,797
  • 5
  • 35
  • 51
1

If you are trying to build your classes dynamically, I recommend you to better take a look at the factory method design pattern, otherwise you will be loosing track of who builds what and how.

To do so, you can code a class that receives a string and returns a class depending on the input string.

Take a look at the book "Design Patterns: Elements of Reusable Object-Oriented Software" by Erich Gamma; Richard Helm; Ralph Johnson; John Vlissides.