库中的NSClassFromString

时间:2011-12-09 14:37:15

标签: iphone objective-c dynamic

我有2个项目。

第一个项目是Cocoa Touch静态库。 另一个是iPad应用程序项目。

在我的图书馆项目中,我打电话来获取一个类并从中创建一个实例:

NSClassFromString(@"ClassName");

唯一的问题是,这将返回零。 在我的主要iPad应用程序项目中,这不会返回nil。

它应该从字符串加载的类是在iPad项目中。

我的解释是,库无法加载类,因为它不在它的包中。 这是真的吗?

我如何解决这个问题,所以库中的调用不会返回nil?

由于

4 个答案:

答案 0 :(得分:1)

引用静态库中未在库中定义的特定类,首先会破坏创建静态库的目的,因为它会在库和使用该库的代码之间创建耦合。

如果你的图书馆需要一个未在其中定义的课程,你应该考虑更改你的API以询问课程名称,而不是假定一个特定的课程:

- (void)doSomething {
  klass = NSClassFromString(@"ClassName");
  obj = [[klass alloc] init];
  [obj doSomething];
  [obj release];
}

- (void)doSomethingWithNewObjectFromClass:(Class)klass {
  obj = [[klass alloc] init];
  [obj doSomething];
  [obj release];
}

最好考虑使用delegate pattern

答案 1 :(得分:1)

项目应配置“其他链接器标志”(OTHER_LDFLAGS)以添加值“-ObjC”。

答案 2 :(得分:0)

  

我的解释是,库无法加载类,因为它   不是它的捆绑。这是真的吗?

不,不是真的。在运行时,没有Libraries,没有Projects,只有你的App,包含所有(你的)链接代码,这些代码都在你的可执行文件中。

你可以在加载Classes之前完成它,你可能拼错了,你必须显示一些代码。

答案 3 :(得分:0)

我在AppDelegate中添加了相同内容,并读取了应用程序类。 让moduleName = Bundle.main.infoDictionary![“ CFBundleName”]作为!串 让personClass:AnyClass? = NSClassFromString(moduleName +“。” +“ TMTServicePresenter”)

正在工作。但是同时如果lib文件“ TelemetrySFService”失败了。

let personClass:AnyClass吗? = NSClassFromString(moduleName +“。” +“ TelemetrySFService”