2

我最近读到动态创建是 Cocoa 中的一种设计模式。但是,我真的不明白它是如何工作的。所以我需要你在你的设计中实现的澄清。

  1. 它是什么?为什么以及何时使用这种设计模式?
  2. 我已阅读您NSClassFromString()用来访问课程的内容。我假设当我想使用我正在处理的项目中不存在的类时使用它。通常当我想使用某个类时,我将它们导入到标题中。使用这种方法会跳过这个#import过程吗?

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

    我引用上面的代码作为例子。如果按照上面的代码做,那意味着我可以创建一个新的 JavaArrayList 类并使用其中的方法对吗?

    JavaArrayList *foo = [[JavaArrayList alloc] init];
    [foo useMethodBelongJava:doWhateverTask];
    
  3. 使用这种设计模式有什么好处?尤其是在 iPhone 开发方面。

4

2 回答 2

1

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

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

从 Objective-C 调用 Java 类的推荐解决方案现在是JNI。看看这个问题,如果那是你想要做的。

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

回到NSClassFromString,它除了实例化 Java 类之外还有其他用途(正如我所提到的,它不再做任何事情了!)。例如,最近我编写了一个用于解析来自 Web 服务的响应的库。为了让它与不同的 Web 服务一起工作,我让它读入了一个配置文件,该文件描述了它所期望的数据格式。对于 Web 服务中的每个字段,我的配置文件指定了要实例化的 Cocoa 类。因此,在我的代码中,我有一个 Cocoa 类名作为字符串。为了实例化我想要的对象,我曾经NSClassFromString把它变成一个Class对象。

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

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

于 2011-05-10T08:36:49.950 回答
0

请参阅此链接: 需要有关 NSClassFromString 的建议

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

这仅适用于 Objective-C 类。您无法将 java 对象导入您的 iphone 应用程序。

于 2011-05-10T07:36:00.097 回答