在运行时创建一个类 - 为什么NSClassFromString和objc_getclass返回nil?

时间:2009-10-28 01:10:13

标签: iphone runtime

我尝试过使用两者:

NSClassFromString and objc_getclass 

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

如果我添加

[TestClass class];

在我调用NSStringFromClass或objc_getclass之前,它可以工作。如果我尝试使用类引用创建类,即:

[TestClass alloc];

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

3 个答案:

答案 0 :(得分: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”)再次返回Foo类而不是nil。

我只能假设在调用静态库中的某个类之前,静态库类没有注册。

答案 1 :(得分:3)

Objective-C运行时参考可以在这里为您提供帮助。例如,objc_getClass的文档说:“指定类的Class对象,如果类没有在Objective-C运行时注册,则为nil。”在寻找有关注册的讨论时,您可以在objc_getClassList:

中找到这个小知识
  

“Objective-C运行时库自动注册源代码中定义的所有类。您可以在运行时创建类定义,并使用objc_addClass函数注册它们。”

(当然,文档已经过时了,因为不推荐使用objc_addClass,而不是objc_allocateClassPair和objc_registerClassPair。)

如果你不让自己变得容易,这看起来就像一个受伤的世界。你有可能在应用程序启动时在代码中引用你的动态类吗?

答案 2 :(得分:3)

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