I want to use this for an object factory: Given a string, create a Class, and if this Class supports a protocol (with a Create() method) then alloc the class and call Create.
Asked
Active
Viewed 2.2k times
2 Answers
272
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
id instance = [[class alloc] init];
[instance create];
}

Chuck
- 234,037
- 30
- 302
- 389
-
8He asked two questions in his title :) – ctpenrose Sep 05 '13 at 00:15
-
4One step further: `id
instance = [[class alloc] init]` – keeshux Jul 01 '14 at 08:42 -
If you don't have or know the class name, then use [instance class] or NSStringFromClass([instance class]) – paiego Jul 25 '14 at 23:11
15
Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
[[klass alloc] create];
}
May I, however, point out just how many awful Objective-C rules you're breaking by doing the above? For example, you should never be calling methods on an allocated-but-not-initialized instance. The Xcode Static Analyzer will give you all sorts of warnings about memory leaks.
A better option would be this:
[[[klass alloc] init] create];
But you seem to imply that you don't want to call init.
You could consider a class method: [klass create]
, which would return a non-owned instance of klass
. Then you'd just check [klass respondsToSelector:@selector(create)]
before calling it.

BJ Homer
- 48,806
- 11
- 116
- 129
-
1Thanks. You're right, the Create method should be a class method. I think this is usually how object factories are designed. – Jacko Feb 27 '10 at 20:06
-
1