Objective-C中的动态即时类可能吗?

时间:2008-12-19 18:31:43

标签: iphone objective-c xml cocoa cocoa-touch

我的问题如下。我有一个简单地采用XML摘录和XPath的方法。然后它应该为我创建一个XML摘录的对象数组。这意味着如果我传递了以下XML:

<user>
  <name>Bob</name>
  <age>50</age>
</user>

我的方法将实例化User类的实例,并使用键值编码来设置实例变量。这是相当直接的。唯一的问题是我来自大多数脚本背景,并试图看看是否可以将方法传递给类名。现在它正在做一个User类,后来它可能是一个Cars类,然后是一个Home类。在保持代码尽可能抽象的同时,从这种不同类型的方法实例化对象的最佳方法是什么?

4 个答案:

答案 0 :(得分:54)

要使用其名称实例化类,可以使用NSClassFromString

id obj = [[NSClassFromString(@"MySpecialClass") alloc] init];

答案 1 :(得分:23)

类是对象,可以像其他对象一样使用/发送。

创建一个类对象:

Class classForElement = [MyUserClass class];

实例化该类的对象

id newObject = [[classForElement alloc] init];

如果类名与元素名不同,请创建一个字典,其中Class为对象,元素名为键。

[NSDictionary dictionaryWithObjectsAndKeys:
                         [MyUserClass class], @"user", 
                         [MyCarClass class], @"car", 
                         [MyHomeClass class], @"home",
                          nil]];

答案 2 :(得分:1)

您想深入了解核心数据。托管对象可能会拯救。

CocoaDevCentral有一些介绍文章,但您可能需要Apple文档。

http://cocoadevcentral.com/articles/000086.php

[编辑]我刚才提醒你,你是在iPhone上做的。核心数据框架的不可用并不意味着你不能借用它,只是重新实现你需要的东西。其中一个开源OpenStep框架可能有代码。

在移动设备上,您可能需要注意数据的大小。

Ezra Epstein关于类的运行时创建(以及更多):

http://www.macdevcenter.com/pub/a/mac/2002/05/24/runtime_partone.html

答案 3 :(得分:0)

尝试在方法签名中使用id作为参数类型。可以将id对象类型转换为任何类对象

你在为iPhone做项目吗?您使用的是NSXMLNode吗?如果您是,请注意只能在模拟器上使用NSXMLNode。它不适用于iPhone,因为NSXMLNode是核心库的一部分。