我尝试过使用两者:
NSClassFromString and objc_getclass
返回一个类,所以我可以在运行时创建它,但是对于某些类,两个函数都返回nil,例如“TestClass”。请注意,NSClassFromString适用于99%的类。
如果我添加
[TestClass class];
在我调用NSStringFromClass或objc_getclass之前,它可以工作。如果我尝试使用类引用创建类,即:
[TestClass alloc];
它也有效。那么如何强制类在运行时加载,以便NSClassFromString或objc_getclass不会返回nil?
答案 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