Example:
I have 10 view controllers, which are all allocated and initialized in the same way:
UIViewController *controller = [[MyViewController alloc] initWithNib];
(note that -initWithNib is a custom method of a UIViewController subclass)
The next view controller class is OtherViewController, and so on. I want to load the view controllers lazily, just when I need them. But to do that, I need to have some kind of “array” that will give me the corresponding class for a given index, so that I can initialize it.
I ended up creating a method with a big switch-statement, that will just do that nasty allocation and initialization separately for every single view controller. I’m not happy with that. There it would be much better if I could assign the appropriate class to a variable, and then at the end of the switch statement just allocate and initialize that class from the variable.
Is there a way to achieve that?
EDIT: I’ve found a function
id class_createInstance(Class cls, size_t extraBytes)
and every class seems to have a property “class”. But I can’t assign it to an instance variable. This doesn’t work:
Class cls = [UIImage class];
cls *image = [cls imageNamed:@"avatar.png"];
The first line compiles. But the second one gives an error: “image undeclared”.
If you know the names of the classes at compile time, you can assign the classes to Class variables. For example:
Then you could have (classid would be a constant known at compile time that would map to a desired class:
Assuming that method is defined in a class named MyFactory, you can then do:
If you don’t have the compile time name of the class, you can simply do the following:
Since your original question involves a set of UIViewControllers though, there’s no reason to lose type safety with the latter method.