【问题标题】:Dynamically instanting classes in Objective-C, possible?在 Objective-C 中动态实例化类,可能吗?
【发布时间】:2008-12-19 18:31:42
【问题描述】:

我的问题如下。我有一个方法,它只需要一个 XML 摘录和一个 XPath。然后它应该为该 XML 摘录创建一个对象数组。意思是如果我通过了以下 XML:

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

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

【问题讨论】:

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


    【解决方案1】:

    要使用其名称实例化一个类,您可以使用NSClassFromString:

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

    【讨论】:

      【解决方案2】:

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

      创建类对象:

      Class classForElement = [MyUserClass class];
      

      实例化该类的对象

      id newObject = [[classForElement alloc] init];
      

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

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

      【讨论】:

        【解决方案3】:

        您想深入了解 Core Data。托管对象可能会派上用场。

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

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

        [edit] 我刚刚被提醒您是在 iPhone 上执行此操作的。 Core Data 框架的不可用并不意味着您不能从中借用,而只是重新实现您需要的东西。开源 OpenStep 框架之一可能有代码。

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

        Ezra Epstein 谈运行时创建类(以及更多):

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

        【讨论】:

        • 注意 cocoa-touch 标签。 iPhone 上不存在 Core Data。
        • 不过,它提供了解决方案。重新创建最小子集
        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-07
          • 2013-12-02
          • 2013-08-20
          • 1970-01-01
          • 2010-10-31
          • 2014-01-26
          • 2019-11-08
          相关资源
          最近更新 更多