按名称定义和转换 class

Defining and casting a class by its name

我有这些行

MyClassA *object = [[MyClassA alloc] init];
MyClassB *object = [[MyClassB alloc] init];
MyClassC *object = [[MyClassC alloc] init];
...

我想转换为通用方法以从 class 名称创建对象。

假设我有这个

NSString *className = @"MyClassA"

如何创建这条线

MyClassA *object = [[MyClassA alloc] init];

这部分[[MyClassA alloc] init]很简单,因为我能做到

[[NSClassFromString(className) alloc] init]

但是

MyClassA *object 部分?

??????????? = [[NSClassFromString(className) alloc] init];

我在问号上加了什么?

id object,但您将无法 "cast" 使用字符串。

如果您随后需要对该 id 对象调用方法,请执行以下操作:

if ([object respondsToSelector:@selector(myMethod:)])
    [object performSelector:@selector(myMethod:) withObject:@"param1"];

首先检查对象是否响应该选择器并调用它。

我不知道您要解决什么问题,但在使用此方法之前,请评估不涉及我刚才描述的内容的替代解决方案:)

最简单和最通用的形式:

id object = [[NSClassFromString(className) alloc] init];

但实际上,您应该通过创建描述这些 类 将提供的常见内容的协议来提供更多信息和形式,因此您将拥有类似的东西:

id < MyClass > object = [[NSClassFromString(className) alloc] init];

@protocol MyClass < NSObject >

// method definitions supported by all classes

@end

(您的 MyClassA/B/C 将实施该协议)