按名称定义和转换类

时间:2015-03-15 15:15:28

标签: ios objective-c cocoa cocoa-touch

我有这些行

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

我想转换为通用方法,从类名创建一个对象。

假设我有这个

NSString *className = @"MyClassA"

如何创建此行

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

这部分[[MyClassA alloc] init]很容易,因为我可以做到

[[NSClassFromString(className) alloc] init]

怎么样?

MyClassA *object部分?

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

我对问号有什么看法?

2 个答案:

答案 0 :(得分:3)

以最简单和最通用的形式:

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会实施协议)

答案 1 :(得分:1)

id object,但您无法使用字符串“强制转换”。

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

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

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

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