2009-05-26 85 views
3

实施例:我该如何动态创建一个类的实例?

我有10个视图控制器,它们都分配并以同样的方式初始化:

UIViewController *controller = [[MyViewController alloc] initWithNib]; 

(注意-initWithNib是UIViewController子类的一个自定义的方法)

下一个视图控制器类是OtherViewController,依此类推。我想在我需要的时候懒洋洋地加载视图控制器。但要做到这一点,我需要有一些“数组”,它会给我一个给定索引的相应类,以便我可以初始化它。

我最终创建了一个带有大开关语句的方法,它将为每个视图控制器分别执行那些令人讨厌的分配和初始化。我对此不满意。如果我可以将适当的类分配给一个变量,那么会更好,然后在switch语句的末尾,只需从变量中分配并初始化该类。

有没有办法做到这一点?

编辑:我发现了一个功能

id class_createInstance(Class cls, size_t extraBytes) 

,每类似乎有一个属性“类”。但是我不能将它分配给一个实例变量。这是行不通的:

Class cls = [UIImage class]; 
cls *image = [cls imageNamed:@"avatar.png"]; 

第一行编译。但第二个提供了一个错误:“图像未声明”。

+3

看起来像一个确切的副本http://stackoverflow.com/questions/381793 – smorgan 2009-05-26 20:30:31

+1

我编辑了我的答案,包括一个基本的工厂模式。你想这样做:id image = [cls imageNamed:@“avatar.png”]。但是,最好在这里使用通用的基本类型(即UIImage * image = ...),因为问题的第一部分表明情况就是这样。 – Jason 2009-05-26 20:51:49

回答

13

如果您在编译时知道类的名称,则可以将这些类分配给类变量。例如:

static Class factory[2]; 

factory[0] = [MyViewController1 class]; 
factory[1] = [MyViewController2 class]; 
... 

然后,你可以有(的classid将是在编译时已知的常数,将映射到一个期望的类:

-(UIViewController*)createViewController:(int)classid 
{ 
    return [[factory[classid] alloc] init]; 
} 

假设方法在类名为MyFactory被定义,那么你可以这样做:

MyFactory * fac = [[MyFactory alloc] init]; 
UIViewController * v1 = [fac createViewController: 0]; // typed 
id v2 = [fac createViewController: 1]; // untyped 

如果你没有类的编译时的名字,你可以简单地做到以下几点:

#include <objc/objc-runtime.h> 

id object = [[NSClassFromString(@"TheClassName") alloc] init]; 

由于您的原始问题涉及到一组UIViewControllers,所以没有理由使用后一种方法丢失类型安全。

0

你想要的是反射。尽管没有Objective-C的概念 - 但该术语可能会帮助Google更好地回答您的答案。

+0

-1让我休息一下 - 这是一个完全正确的答案,也是一小时后的唯一答案。仅仅因为你不知道一种特定的语言并不意味着一个答案是不正确的 - 它可以帮助另一个用户回答这个问题。这个网站上的一些人需要不那么认真,或者找到新的爱好。 – Gandalf 2009-05-26 23:38:49

0

的Objective C的参考也将是一个很好的地方寻找到这些来电。尝试搜索Objective-C 2.0运行时参考,因为我无法添加链接