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

StackOverflow https://stackoverflow.com/questions/1634644

  •  06-07-2019
  •  | 
  •  

我尝试过使用两者:

NSClassFromString and objc_getclass 

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

如果我添加

[TestClass class];

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

[TestClass alloc];

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

有帮助吗?

解决方案

我遇到了同样的问题。在我的情况下,我有使用

查找课程的代码
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。

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

其他提示

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

中找到这个小知识
  

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top