什么是动态创作?

时间:2011-05-10 07:21:52

标签: iphone cocoa-design-patterns

我最近读到有关Dynamic Creation作为Cocoa中的设计模式之一。但是,我真的不明白它是如何工作的。所以我需要你在设计中实施的澄清。

  1. 这是什么?为什么以及何时使用这种设计模式?
  2. 我读过您使用NSClassFromString()来访问该课程。我假设当我想使用我正在处理的项目中不存在的类时,我会使用它。通常当我想使用某个类时,我在头文件中导入它们。使用此方法是否会跳过#import进程?

    Class JavaArrayList = NSClassFromString(@"java.util.ArrayList");
    

    我引用上面的代码作为示例。如果根据上面的代码,这意味着我可以创建一个新的JavaArrayList类并使用它中的方法吗?

    JavaArrayList *foo = [[JavaArrayList alloc] init];
    [foo useMethodBelongJava:doWhateverTask];
    
  3. 使用此设计模式有什么好处?特别是在iPhone开发中。

2 个答案:

答案 0 :(得分:1)

您的示例似乎正在使用该模式来实例化Java类。在过去(我认为是MacOS 10.4),Apple有一些称为Cocoa-Java Bridge的技术,它允许您在Objective-C代码中使用Java类。您必须以指定的方式实例化它们,因为它们没有要导入的Objective-C头文件。

但是,从Snow Leopard开始,Java Bridge不再存在,因此您问题中的代码将不再起作用。

从Objective-C调用Java类的推荐解决方案现在是JNI。如果您正在尝试这样做,请查看this question

  
      
  1. 这是什么?为什么以及何时使用这种设计模式?
  2.   

回到NSClassFromString,它除了实例化Java类之外还有其他用途(正如我所提到的,它不再做了!)。例如,最近我编写了一个用于解析Web服务响应的库。为了使它能够与不同的Web服务一起工作,我在配置文件中读取了它,描述了它所期望的数据格式。对于Web服务中的每个字段,我的配置文件指定了要实例化的Cocoa类。因此,在我的代码中,我将Cocoa类名称作为字符串。为了实例化我想要的对象,我使用NSClassFromString将其转换为Class对象。

  
      
  1. 通常当我想使用某个类时,我会在标题中导入它们。使用这种方法是否会跳过#import进程?
  2.   

它可以做到。 NSClassFromString将实例化运行时出现的任何类,因此您不需要标头即可使用它。如果你没有标题,那么当你尝试使用新实例化的类时,你会得到一堆警告“可能没有响应选择器”,因为编译器没有足够的信息来提供帮助。但是,在许多NSClassFromString有用的情况下,头文件不可用。

答案 1 :(得分:0)

查看此链接: need advise about NSClassFromString

iPhone的唯一真正好处是能够从较新的API引用类并仍然以旧API为目标。从4.0开始,您无论如何都可以通过设置项目的部署目标来执行此操作。我再也看不出你有什么理由将它用于iPhone编程了。

这只适用于Objective-C类。您无法将java对象导入到iPhone应用程序中。