我一直在使用这两种尝试:
NSClassFromString and objc_getclass
返回一类,这样我就可以在运行时创建,但两个函数返回nil对于某些类,例如“识别TestClass”。 需要注意的是NSClassFromString对我的作品的类别99%。
如果我添加
[TestClass class];
之前,我打电话NSStringFromClass或objc_getclass它,它的工作原理。 如果我尝试使用类引用刚刚创建类,即:
[TestClass alloc];
它也能工作。 所以,我怎么能强迫类在运行时加载所以NSClassFromString或objc_getclass将不会返回零?
我碰到了同样的问题。 在我来说,我有代码,使用查找类
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类。
我只能假设静态库类没有注册,直到在静态库中的一个类进行呼叫。
Objective-C的运行时参考可以帮助你在这里。 例如,对于objc_getClass文档说,“用于命名的类的类对象,或零如果类不与Objective-C运行注册”。 四处找注册的讨论,你会发现这个珍闻在objc_getClassList:
“Objective-C的运行时库自动注册在源代码中定义的所有类,你可以在运行时创建类的定义,并与objc_addClass功能进行注册。”
(当然还有文档是过时的,因为objc_addClass已过时,objc_allocateClassPair和objc_registerClassPair在它的地方。)
这看起来像受伤的世界里,如果你不使这个容易对自己。 任何机会,你可以参考你的动态类代码的应用程序启动时?
我不得不类(如TestClass.m)手动添加到构建设置。 构建阶段>编译源代码> +> TestClass.m
文章来源: Create a class at runtime - Why do NSClassFromString AND objc_getclass return nil?