2009-10-28 55 views
2

我使用这两种尝试:在运行时创建一个类 - 为什么NSClassFromString和objc_getclass返回nil?

NSClassFromString and objc_getclass 

返回一个类,这样我就可以在运行时创建,但两个函数返回nil对于某些类,例如“识别TestClass”。请注意,对于99%的类,NSClassFromString适用于我。

如果我添加

[TestClass class]; 

之前,我打电话NSStringFromClass或objc_getclass它,它的工作原理。并且如果我尝试仅使用类别参考创建课程,即:

[TestClass alloc]; 

它也可以工作。那么如何强制类在运行时加载,以便NSClassFromString或objc_getclass不会返回nil?

回答

6

我遇到了同样的问题。在我的情况下,我有代码正在查找类使用

Class aClass = objc_getClass("Foo"); 

当Foo类与我的AppDelegate在同一个项目捆绑包中工作。

作为重构代码的一部分,我将Foo类和关联的模型类从AppDelegate项目中移出到一个通用的静态lib项目中,该项目更易于测试和重用。

当我将Foo类移入libFooBar时,objc_getClass(“Foo”)现在返回nil而不是Foo类。

为了解决这个问题,我调用了我感兴趣的类,以便libFooBar中的类用Objective-C运行时注册。我这样做,像这样:

Foo* foo = [[Foo alloc] init]; 
[foo release]; 
Class aClass = objc_getClass("Foo"); 

现在objc_getClass(“富”)再次返回,而不是零Foo类。

我只能假定静态库类没有被注册,直到对静态库中的一个类的调用被创建。

3

Objective-C运行时参考可以帮助你。例如,objc_getClass的文档说:“指定类的Class对象,或者如果类未在Objective-C运行时注册,则为nil。”四处找注册的讨论,你会发现这个珍闻在objc_getClassList:

“Objective-C的运行时库自动注册在源代码中定义的所有类可以在运行时创建类的定义,并与objc_addClass注册。功能。”

(当然还有文档是过时的,因为objc_addClass已过时,objc_allocateClassPair和objc_registerClassPair在它的地方。)

这看起来像受伤的世界里,如果你不使这个容易对自己。任何机会,当应用程序启动时,您可以在代码中引用您的动态类?

+0

这可能是我必须做的....虽然看起来很奇怪! – 2009-10-28 12:59:59

3

我必须手动将类(例如TestClass.m)添加到构建设置。构建阶段>编译源> +> TestClass。m

相关问题