我有2个项目。
第一个项目是Cocoa Touch静态库。 另一个是iPad应用程序项目。
在我的图书馆项目中,我打电话来获取一个类并从中创建一个实例:
NSClassFromString(@"ClassName");
唯一的问题是,这将返回零。 在我的主要iPad应用程序项目中,这不会返回nil。
它应该从字符串加载的类是在iPad项目中。
我的解释是,库无法加载类,因为它不在它的包中。 这是真的吗?
我如何解决这个问题,所以库中的调用不会返回nil?
由于
答案 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”