在运行时创建一个类 - 为什么NSClassFromString和objc_getclass回报为零

2019-09-01 19:16发布

我一直在使用这两种尝试:

NSClassFromString and objc_getclass 

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

如果我添加

[TestClass class];

之前,我打电话NSStringFromClass或objc_getclass它,它的工作原理。 如果我尝试使用类引用刚刚创建类,即:

[TestClass alloc];

它也能工作。 所以,我怎么能强迫类在运行时加载所以NSClassFromString或objc_getclass将不会返回零?

Answer 1:

我碰到了同样的问题。 在我来说,我有代码,使用查找类

Class aClass = objc_getClass("Foo");

其中,当Foo类是在同一个项目包是我的AppDelegate工作。

作为重构代码的一部分,让我感动的Foo类和相关模型类出AppDelegate的项目到一个共同的静态库项目,这将是更容易测试和重用。

当我搬到Foo类到libFooBar的objc_getClass(“富”),现在已经回到零,而不是Foo类。

为了解决这个问题,我把电话给我感兴趣的,以便从libFooBar类与Objective-C的运行时注册的类。 我这样做,像这样:

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

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

我只能假设静态库类没有注册,直到在静态库中的一个类进行呼叫。



Answer 2:

Objective-C的运行时参考可以帮助你在这里。 例如,对于objc_getClass文档说,“用于命名的类的类对象,或零如果类不与Objective-C运行注册”。 四处找注册的讨论,你会发现这个珍闻在objc_getClassList:

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

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

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



Answer 3:

我不得不类(如TestClass.m)手动添加到构建设置。 构建阶段>编译源代码> +> TestClass.m



文章来源: Create a class at runtime - Why do NSClassFromString AND objc_getclass return nil?